我已经被困在这几天了,想知道是否有人可以提供帮助。
数据库表: '页面','状态',' 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();
对此有任何想法都会感激不尽!先谢谢你,克里斯。
答案 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);
}