Laravel 5.2 子查询 - 按多态主元过滤行 table 最后一行
Laravel 5.2 subquery - filter rows by polymorphic pivot table last row
我已经坚持了几天了,想知道是否有人可以提供帮助。
数据库表:
'pages'、'statuses'、'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();
}
我想做的是检索一个页面列表,其中分配的最新状态的 ID 为 ['array_of_status_ids'](scopeWithStatus 中的“$statuses”)
$pages = Page::withStatus([1,2,3,4])->get();
如有任何想法,我们将不胜感激!提前致谢,克里斯。
首先,pages()
关系看起来使用了错误的主元 table 细节。
'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);
}
我已经坚持了几天了,想知道是否有人可以提供帮助。
数据库表: 'pages'、'statuses'、'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();
}
我想做的是检索一个页面列表,其中分配的最新状态的 ID 为 ['array_of_status_ids'](scopeWithStatus 中的“$statuses”)
$pages = Page::withStatus([1,2,3,4])->get();
如有任何想法,我们将不胜感激!提前致谢,克里斯。
首先,pages()
关系看起来使用了错误的主元 table 细节。
'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);
}