Select 来自 select 使用 Laravel eloquent

Select from select using Laravel eloquent

我想获得所有用户最喜欢的产品。查询应该是这样的:

SELECT * 
FROM products 
WHERE id IN (SELECT id FROM favourites WHERE user_id == Auth::id())

如何使用 eloquent 进行查询?

您正试图实现这样的目标:

在官方文档中可以找到Advanced where clauses

的解释
DB::table('products')
    ->whereIn('id', function($query)
        {
            $query->select('id')
                  ->from('favourites')
                  ->where('favourites.user_id', Auth::id());
        })
    ->get()

最终结果将是(您可以看到使用 toSql() 方法而不是 get() 转储查询):

select * from `products` where `id` in (select `id` from `favourites` where `favourites`.`user_id` = ?)

你说“我该怎么做”是什么意思?您是在问如何构造它或如何使用 eloquent 查询?

如果您提出查询:

Product::whereIn('id', Favourite::select('id')->whereUserId(Auth::id())->get()->toArray())->get();

应该可以。


如果你问结构,你应该在模型中定义关系。

在用户模型上;

public function favourites()
{
    return $this->hasMany(Favourite::class, 'user_id');
}

以及最喜欢的模特;

public function favoriteProduct()
{
    return $this->belongsTo(Product::class, '[the product_id column on favourites table]');
}

然后就可以点赞了;

$userFavourites = User::with('favourites.favoriteProduct')->whereId(Auth::id())->favourites;

您认为:

@foreach($userFavourites as $userFavourite)
    {{ $userFavourite->favouriteProduct }}
@endforeach

这是最简单的。另一方面;你可以使用 Has Many Through 关系。

这将是最干净的方式。