我使用Laravel 5.3。
我有两张table:
Articles
---------
id
cat_id
title
字符串
和
Category
---------
id
parent_id
title
型
我已经在我的模型中定义了我的关系:
// Article model
public function category()
{
return $this->belongsTo(Category::class);
}
// Category model
public function children()
{
return $this->hasMany(Category::class, 'parent_id', 'id');
}
型
有没有一个简单的方法使用口才有一个列表与文章计数的类别。困难的是,我想组类别在id_parent = 0
,即我想只显示父类别与文章计数的儿童。
我试过这样的方法:
$category = new \App\Models\Category();
$categoryTable = $category->getTable();
return $category->leftJoin('article', 'article.cat_id', '=', 'category.id')
->whereIn('article.cat_id', function($query)
{
$query->select('cat_id')
->from('categories')
->where('categories.parent_id', ???)
->orWhere($this->tableName .'.cat_id', $id);
})
->groupBy('cat_id');
型
但我迷失了...
7条答案
按热度按时间9njqaruj1#
您可以使用
withCount()
。它从5.3版本开始可用欲了解更多有关雄辩的信息,请访问:https://laravel.com/docs/5.3/eloquent-relationships
zkure5ic2#
在
Category
模型中定义一个articles()
关系:字符串
然后你可以尝试它:
型
eh57zj3b3#
你可以使用
hasManyThrough()
Eloquent方法来获取所有children的Articles,然后将article计数添加到一个漂亮的小getter中。我将getter添加到模型上的$appends
数组中,以帮助在Tinker输出中说明它。字符串
下面是Tinker的输出:
型
如果你想限制你的Category查询到那些有文章的子条目,你可以使用
has()
方法:型
以下是关于
has()
方法的更多信息:https://laravel.com/docs/5.3/eloquent-relationships#querying-relationship-existence
hasManyThrough()
方法:https://laravel.com/docs/5.3/eloquent-relationships#has-many-through
ncecgwcz4#
关于
Carlos_E.
的回答:您可以通过使用
whereHas
而不是whereIn
来改进查询:字符串
du7egjpx5#
这应该是可行的:
字符串
上面的查询将获得类别ID和属于该类别的所有文章的计数。
再次阅读您的问题和评论后,如果我理解正确的话,您希望获得属于这些类别的所有文章的计数(parent_id = 0)+属于子类别的文章的计数(parent_id =(某个类别的id))。
现在我没有办法很容易地测试这一点,但我认为沿着这些路线的东西沿着应该工作。
型
这就是说,我认为你最好有一个名为count in categories的列,并在每次添加新文章时更新它。
f2uvfpb96#
字符串
szqfcxe27#
我相信有人仍然在经历这个问题,我能够用下面的方法解决它,假设我有一个Agent模型和一个Schedule模型,即一个Agent可能有许多时间表:
字符串
有些代理可能不一定有分配的时间表,因此,我在调用
with()
方法之前过滤了这些时间表,如下所示:型
希望这有帮助!