gpt4 book ai didi

php - 拉维尔 5.4 : get products with favorite and display favorites product for each user

转载 作者:可可西里 更新时间:2023-11-01 01:12:29 24 4
gpt4 key购买 nike

我正在尝试获取收藏夹中的所有产品并像用户登录一样显示它们,收藏夹中的该产品将显示为收藏夹,否则他可以将它们添加到收藏夹。

这是我的 Controller

$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->favorite->product_id }}

我明白了

Property [product_id] does not exist on this collection instance

我如何在 blade 中显示

    @foreach($products as $product)
<div class="col-md-4 col-sm-6">
<div class="thumbnail no-border no-padding">
<div class="media">
<a class="media-link" href="{!! URL::route('products.show', $product->id) !!}">
{!! Html::image('images/products/'.$product->image, $product->name) !!}
<span class="icon-view">
<strong><i class="fa fa-eye"></i></strong>
</span>
</a>
</div>
<div class="caption text-center">
<h4 class="caption-title">{!! $product->name !!}</h4>

<div class="price">
<ins>{!! $product->price !!}</ins>
{{--<del>$425.00</del>--}}
</div>
{{ $product->favorite->product_id }}
<div class="buttons">
@if(count($product->favorite) == 1)
<span class="btn btn-theme btn-theme-transparent">
<i class="fa fa-heart text-danger"></i>
</span>
@else
{!! Form::open(['route'=>'favorite.store', 'class'=>'favorite-products']) !!}
{!! Form::hidden('product_id', $product->id) !!}
@if ( Auth::guard( 'web' )->check() != 0 )
{!! Form::hidden('user_id', Auth::guard( 'web' )->user()->id) !!}
@endif
<button class="btn btn-theme btn-theme-transparent btn-wish-list">
<i class="fa fa-heart"></i>
</button>
@endif


{!! Form::close() !!}


{!! Form::open(['route'=>'add.to.cart', 'class'=>'btn product-shoppingcart-icon']) !!}
{!! Form::hidden('pro_id', $product->id) !!}
<button class="btn btn-theme btn-theme-transparent btn-icon-left">
<i class="fa fa-shopping-cart"></i>{{ trans('interface.addToCart') }}
</button>
{!! Form::close() !!}
<a class="btn btn-theme btn-theme-transparent btn-compare"
href="#"><i class="fa fa-exchange"></i></a>
</div>
</div>
</div>
</div>
@endforeach

最佳答案

我认为当前查询效率低下。据我了解,一个产品可以被很多用户喜欢。如果您随后加载每个产品的所有收藏夹,您还将加载与当前用户不相关的收藏夹。因此,您应该只选择相关的收藏夹:

$products = Product::query()
->where('quantity', '>', 0)
->with(['favorite' => function ($hasMany) {
$hasMany->where('user_id', \Auth::user()->id);
}])
->orderBy('price', $sort)
->get();

然后您将得到每个产品的收藏夹集合,尽管集合中最多只有一个收藏夹(因为当前用户只能喜欢一个产品一次,对吧?)。所以你想访问你 View 中的东西:

@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() 会给出项目的数量。由于当前用户可能没有或只有一个收藏夹,因此我们会收到 01 作为结果,这也可以看作是 falsetrue 分别。


编辑:为避免未登录用户出现问题,您可以使用此查询,届时它不会加载收藏夹 关系。

$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());
});
}

关于php - 拉维尔 5.4 : get products with favorite and display favorites product for each user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49596609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com