Laravel 5.2子查询 - 按多态数据透视表最后一行过滤行

时间:2016-08-22 09:24:52

标签: laravel eloquent polymorphism relationships

我已经被困在这几天了,想知道是否有人可以提供帮助。

数据库表: '页面','状态',' status_assignments'

页面模型:

protected $appends = ['status'];

public function statuses()
{
    return $this->morphToMany('App\Models\Status', 'statusable', 'status_assignments')->withPivot('id', 'assigned_by_user_id', 'locked')->withTimestamps();
}

public function getStatusAttribute()
{
    return $this->statuses()->orderBy('pivot_id', 'DESC')->first();
}

public function scopeWithStatus($query, $statuses)
{
    $query->with('statuses');

    if(is_array($statuses) && count($statuses) > 0)
    {
        $query->whereHas('statuses', function($q) use($statuses)
        {
            $cs = $q->orderBy('pivot_id', 'DESC')->first();
            foreach($statuses as $status) $q->where('id', $status)->where('pivot_id', $cs->pivot->id);
        });
    }

    return $query;
}

状态模型:

public function pages()
{
    return $this->morphedByMany('App\Models\Page', 'categorizable', 'category_assignments')->withTimestamps();
}

我尝试做的是检索已分配的最新状态为[&#39; array_of_status_ids&#39;]的&#39; $状态&#39;在scopeWithStatus中的页面列表< / p>

$pages = Page::withStatus([1,2,3,4])->get();

对此有任何想法都会感激不尽!先谢谢你,克里斯。

1 个答案:

答案 0 :(得分:0)

首先,pages()关系看起来像是使用了错误的数据透视表细节。

  

'Categorizable','category_assignments'

那些应该是'statusable', 'status_assignments'

有时我发现在混合中抛出一些原始SQL比编写复杂的Query Builder语句更简单。

使用子查询检查每个页面的最新状态条目包含在 $statuses

public function scopeWithStatuses($query, $statuses = [])
{
    $subQuery = '(select status_id from status_assignments'
        . ' where status_assignments.statusable_id = pages.id'
        . ' and status_assignments.statusable_type = "App\\\Test\\\Page"'
        . ' order by status_assignments.id desc limit 1)';

    $query->whereIn(\DB::raw($subQuery), (array) $statuses);
}