Lravel 5.4:获得最喜欢的产品并为每个用户显示最喜欢的产品

时间:2018-04-01 09:20:51

标签: php laravel eloquent laravel-5.4

我正在尝试获取所有喜欢的产品,并将其显示为用户登录,并且此产品在收藏夹中显示为最喜欢的其他产品,他可以将其添加到收藏夹中。

这是我的控制器

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 }}

3 个答案:

答案 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()因此会为您提供项目数。由于当前用户可能没有或只有一个收藏,我们会收到01作为结果,也可以分别看作falsetrue。< / 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