我想为此模型创建一个withCount子查询。
感谢Iqbal Butt 我有这个片段来获取计数。
$count = Action::select('article_id as assigned');
if (!empty($action_type_id))
{
$count = $count->where('action_type_id', $action_type_id);
}
if (!empty($set_id))
{
$count = $count->where('set_id', $set_id);
}
$count = $count->distinct('article_id')->count('article_id');
我想像这样执行它,但是我感到这是一个痛苦的缺陷。
说明修改
我与文章有多对多关系。
每篇文章都有很多动作。
动作可以具有多种动作类型。
我需要计算给定集合中每篇文章的操作类型。
$sets = Set::withCount(['actions' => function ($q) use ($action_type_id, $set_id) {
$q->select('article_id as assigned');
if (!empty($action_type_id))
{
$q->where('action_type_id', $action_type_id);
}
if (!empty($set_id))
{
$q->where('set_id', $set_id);
}
$q->distinct('article_id')
->count('article_id');
// I believe this is executing inner query
}])
->get();
return $sets;
这给了我错误,更多的是因为内部查询正在执行而没有外部查询。
SQLSTATE [42S22]:找不到列:1054中的未知列'sets.id' “ where子句”(SQL:选择count(distinct
article_id
)作为聚合 来自actions
,其中sets
。id
=actions
。set_id
和action_type_id
= 1和set_id
= 1)
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
/**
* Get the sets for the article.
*/
public function sets()
{
return $this->belongsToMany(Set::class);
}
public function actions()
{
return $this->hasMany(Action::class);
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Set extends Model
{
/**
* Get the articles for the set.
*/
public function articles()
{
return $this->belongsToMany(Article::class);
}
public function actions()
{
return $this->hasMany(Action::class);
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Action extends Model
{
/**
* Get the set that owns the action.
*/
public function set()
{
return $this->belongsTo(Set::class);
}
/**
* Get the article that owns the action.
*/
public function article()
{
return $this->belongsTo(Article::class);
}
}
动作
id
set_id
article_id
action_type_id
设置
id
name
文章
id
name
文章集
id
set_id
article_id
答案 0 :(得分:1)
尽管它使用返回的集合来计算计数,但是这里将获得您需要的数据。
$articles = Set::find($set_id)
->articles()
->with('actions')
->get()
->map(function($article){
$article->action_type_count = $article->actions->unique('action_type')->count();
return $article;
});
这将为您提供一系列文章。操作类型计数在集合中每篇文章的属性action_type_count
中。因此,要获得第一篇文章的动作类型计数:
$articles->first()->action_type_count;