产品和用户多对多,判断产品是否关联过用户,

产品和用户多对多,判断产品是否关联过用户

$user = auth()->user();
$products = Product::all();
// 判断产品里面是否有用户
foreach($products as $product) {
    $existUsers = $product->users()->where('id', $user->id)->first();
    $product->submitted = $existUsers ? true : false; 
}
// 看了评论,我改成这样了,的确之前的是N+1
$user = auth()->user();
$products = Product::with('users')->get()->transform(function($product) use ($user) {
    $productUserIds = $product->users->pluck('id')->toArray();
    $product->submitted = in_array($user->id, $productUserIds) ? true : false; 
    return $product;
});
return $products;
// 发现了有个方法contains, 这是我想要的,firstWhere和where其实也是colloection 里面的方法,这是我没想到的。
$user = auth()->user();
$products = Product::with('users')->get()->transform(function($product) use ($user) {
    $product->submitted =  $product->users->contains($user); 
    return $product;
});

return $products;
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

盲写一下,有错误或更好的请各位指出。

$user = auth()->user();
$products = Product::with('users')->get()->transform(function($product) use ($user) {
    $existUsers = $product->users->firstWhere('id', $user->id);
    $product->submitted = $existUsers ? true : false; 
    return $product;
});
1年前 评论
ErzaQ (楼主) 1年前
slowlyo 1年前
ErzaQ (楼主) 1年前
还不出来 1年前
讨论数量: 16

盲写一下,有错误或更好的请各位指出。

$user = auth()->user();
$products = Product::with('users')->get()->transform(function($product) use ($user) {
    $existUsers = $product->users->firstWhere('id', $user->id);
    $product->submitted = $existUsers ? true : false; 
    return $product;
});
1年前 评论
ErzaQ (楼主) 1年前
slowlyo 1年前
ErzaQ (楼主) 1年前
还不出来 1年前

简单写了下 如果有更好的方式或者是错误 请各位指出

$user = auth()->user();
$products = Product::query()->with(['user' => function ($query) use ($user) {
    return $query->where('id', $user->user_id ?? 0);
}])->get()->map(function (Product $items) {
    $submitted = false;
    if ($items->user->isNotEmpty()) {
        $submitted = true;
    }
    $items->submitted = $submitted;
    return $items;
});
1年前 评论
ErzaQ (楼主) 1年前
fatrbaby

请问这样写的意义是什么?

... $product->users->contains($user) ? true : false;
1年前 评论
ErzaQ (楼主) 1年前

直接写SQL行吗? :joy:

1年前 评论

这个可以用访问器呀

class Product extends Model
{
    public function users(): BelongsToMany
    {
        // ...
    }

    public function getSubmittedAttribute()
    {
        return $this->users->contains(auth()->user());
    }
}
$products = Product::with('users')->get();
foreach ($products as $product) {
    // $product->submitted
}
1年前 评论
ErzaQ (楼主) 1年前
还不出来 (作者) 1年前

是否可以用聚合计数的方法来判定?

$user = auth()->user();
$products = Product::withCount(['user' => function (Builder $query) use($user) {
    $query->where('id', $user->id);
}])->get();

// 只要判断 > 0 的就是
$products[0]->user_count > 0;

附链接

模型关联《Laravel 9 中文文档》

1年前 评论
ErzaQ (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!