计算多对多关系?

问题描述 投票:0回答:1

用户和图像之间存在多对多关系。

用户模型

public function image()
{
    return $this->belongsToMany('\App\Image');
}

图像模型

public function user()
{
    return $this->belongsToMany('\App\User');
}

桌子

用户

id | name

图像

id | url

图像_用户

id | image_id | user_id

当用户“收藏”图像时,它会存储在数据透视表中。

id | image_id | user_id
 1      1          1
 2      2          1
 3      1          2

我需要统计每张最喜欢的图像的数量。

我尝试这样的事情:

 Image::with('user')->find(1)->count();

但这计算的是用户数量,而不是收藏数量。

理想情况下,我想返回所有图像数据以及用户数据计数 - 我该怎么做?

laravel laravel-4 eloquent laravel-5
1个回答
4
投票

你可以这样做:

$image = Image::with('user')->find(1) // Get the image with user eager loading
$image->name; // Access any attribute
$image->users->count(); // Get the user count

您甚至可以在图像模型中添加几行来创建“自定义”属性:

public function getFavoritesAttribute()
{
    return count($this->users);
}

然后像这样使用它:

$image->favourites;

这里有更详细的解决方案: Laravel 使用 count 多对多加载相关模型

编辑:您现在可以使用 withCount() 方法,该方法将计算相关模型的数量,而无需实际加载它们。

在你的情况下,它看起来像这样:

$image = Image::withCount('user')->find(1)

了解更多详细信息:https://laravel.com/docs/master/eloquent-relationships#counting-lated-models

© www.soinside.com 2019 - 2024. All rights reserved.