如何在Laravel中获取特定于用户的数据透视数据?

时间:2015-09-12 10:50:01

标签: php laravel laravel-5 eloquent

我有一个users表,一个items表和一个数据透视表item_user

我可以使用belongsToMany关系轻松获取所有用户项目列表或所有项目用户列表。

$item->users;
$user->items;

然而,我将此作为一种“收藏”"关系。

因此,如果我在我的网站上显示所有项目而不管用户,我想知道用户在数据透视表中有哪些项目作为"最喜欢的"。

到目前为止,我有这个:

// Item Model

public function favorites()
{
    return $this->belongsToMany('App\Models\User')->withPivot('user_id')->where('user_id', @\Auth::user()->id);
}

它工作正常,但它运行的查询是:

select `users`.*, `item_user`.`item_id` as `pivot_item_id`, `item_user`.`user_id` as `pivot_user_id` from `users` inner join `item_user` on `users`.`id` = `item_user`.`user_id` where `user_id` = '1' and `item_user`.`item_id` in ('282', '10', '826', '632', '896', '604', '8', '990', '175', '979', '7', '805', '665', '263', '507', '327', '397', '208', '762', '926', '474', '389', '433', '742', '613', '689', '782', '435', '898', '518')

我不需要users表中的数据,我只需要数据透视数据:

SELECT user_id, item_id FROM item_user WHERE user_id = 1 AND item_id IN (1, 2, 3, 4, 5, 6, 282);

无论如何在Laravel中运行效率更高的版本?

1 个答案:

答案 0 :(得分:4)

我尽可能了解您的要求..可以通过向数据透视表添加列来解决此问题。

首先在对项目模型的透视调用中包含“收藏夹”:

return $this->belongsToMany('User', 'user_items')
             ->withPivot('favorite');

注意:反之亦然,也可以定义但不测试该选项。

然后查看它最喜欢的天气:

$item = User::with('items')->get()->find(1)->items->find(2)->pivot->favorite;

但在这种情况下,您还需要组织关系结构,因为用户有很多项目。如果您仍然有任何问题需要了解我的方法,请告诉我。