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

标签 php laravel eloquent laravel-5.4

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

这是我的 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/

相关文章:

java - 在 Android Activity 之间传递 PHP session

php - 如何通过变量获取定义值

javascript - 如何使用 Jquery ajax 从 Laravel 输出 json 响应(发生错误时)

php - Laravel 日志对多对多关系的修订

php - 如何在没有 CURL 的情况下获取网页内容?

php - 如何使用 instagram api 获取带有特定标签的图像?

laravel - 如何在 Lumen 中使用辅助函数?

php - Laravel 返回最后一个用户

php - MySQL 与多个表的关系

php - Laravel:防止 updated_at 填写记录创建