我正在尝试获取所有喜欢的产品,并将其显示为用户登录,并且此产品在收藏夹中显示为最喜欢的其他产品,他可以将其添加到收藏夹中。
这是我的控制器
ForMember(dest => dest.Id, opt => opt.MapFrom(source => source.User.Id))
现在,如果我制作$products = ( new Product )
->where( 'quantity', '>', 0 )
->with( 'favorite' )
->orderBy( 'price', $sort )->get();
,我就会得到最喜欢的数组
dd($product->favorite)
但如果我尝试选择任何此类数组,例如[{"id":1,"product_id":7,"user_id":1,"created_at":"2018-04-01 09:16:23","updated_at":"2018-04-01 09:16:23"}]
我得到了
此集合实例上不存在属性[product_id]
我如何在刀片中显示
{{ $product->favorite->product_id }}
答案 0 :(得分:3)
我认为当前的查询效率低下。据我所知,许多用户都喜欢这种产品。如果您随后加载每个产品的所有收藏夹,您还将加载与当前用户无关的收藏夹。因此,您只应选择相关的收藏夹:
$products = Product::query()
->where('quantity', '>', 0)
->with(['favorite' => function ($hasMany) {
$hasMany->where('user_id', \Auth::user()->id);
}])
->orderBy('price', $sort)
->get();
然后,您将在每个产品上收集一组收藏夹,尽管该收藏中最多只能有一个收藏夹(因为当前用户只能选择一次产品,对吧?)。因此,您希望通过以下方式访问视图中的内容:
@foreach($products as $product)
// ... your html here
@if(count($product->favorite))
<span class="btn btn-theme btn-theme-transparent">
<i class="fa fa-heart text-danger"></i>
</span>
@endif
// ... more html
@endforeach
说明:$product->favorite
是一个集合,count()
因此会为您提供项目数。由于当前用户可能没有或只有一个收藏,我们会收到0
或1
作为结果,也可以分别看作false
和true
。< / p>
修改:为避免未登录用户出现问题,您可以使用此查询,这样就不会加载favorite
关系。
$products = Product::query()
->where('quantity', '>', 0)
->orderBy('price', $sort)
->when(\Auth::check(), function ($query) {
$query->with(['favorite' => function ($hasMany) {
$hasMany->where('user_id', \Auth::user()->id);
}]);
})
->when(\Auth::guest(), function ($query) {
$query->with(['favorite' => function ($hasMany) {
// will exclude all rows but flag the relation as loaded
// and therefore add an empty collection as relation
$hasMany->whereRaw('1 = 0');
}]);
})
->get();
或者,如果有人不喜欢奇怪的数据库调用,它总是返回零行,我们也可以手动设置关系:
$products = Product::query()
->where('quantity', '>', 0)
->orderBy('price', $sort)
->when(\Auth::check(), function ($query) {
$query->with(['favorite' => function ($hasMany) {
$hasMany->where('user_id', \Auth::id());
}]);
})
->get();
if (\Auth::guest()) {
$products->each(function ($product) {
$product->setRelation('favorite', new \Illuminate\Database\Eloquent\Collection());
});
}
答案 1 :(得分:0)
使用foreach()
循环显示favorite
关系集合,以显示所有favorite
个产品。
@foreach($product->favorite as $favorite)
@if($favorite->product_id==$product->id)
///do what you want to do if check match
@endif
@endforeach
答案 2 :(得分:0)
首先制作收藏夹模型和表格名称必须是收藏夹或 protected $ table =&#39;收藏夹&#39;写在最喜欢的模型里面。
在产品模型中建立关系 如果产品有很多喜欢的
public function favorite(){
return $this->hasMany(Favorite::class, 'product_id');
}
其他产品有一个最喜欢的
public function favorite(){
return $this->hasOne(Favorite::class, 'product_id');
}
并在控制器中
$products = Product
->where( 'quantity', '>', 0 )
->orderBy( 'price', $sort )
->get();
并在视野中
@foreach($products as $product)
{{ $product->favorite->product_id }} //if product hasone relation with favorite
// if product hasmany relation in product
@foreach($product->favorite as $favorite)
{{ $favorite->product_id }}
@endforeach
@endforeach