提问者:小点点

使用withCount和Distinct与Laravel


我想为这个模型创建一个withCount子查询。

多亏了伊克巴尔·巴特,我才有了这个片段来计算一下。

$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个未知列“集合”。“where子句”中的id(SQL:选择count(distinctarticle\u id)作为来自actionswhereset的聚合<代码>标识=操作<代码>设置id和操作类型id=1和设置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

共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\u type\u count中。因此,要获得第一篇文章的动作类型计数:

$articles->first()->action_type_count;