提问人:NAVEED SHAHZAD 提问时间:11/7/2023 最后编辑:Tipu Sultan EikoNAVEED SHAHZAD 更新时间:11/8/2023 访问量:67
laravel 应用程序列表(如果上次状态为关闭)
laravel list of Applications if last status is closed
问:
上次状态 已关闭的应用程序
用户 表 1:应用程序
ID(PK) | 名字 |
---|---|
1 | 纳维德 |
表 2:状态
ID(PK) | 地位 | application_id(fk) |
---|---|---|
1 | 待定 | 1 |
2 | 提交 | 1 |
3 | 闭 | 1 |
4 | 观察 | 1 |
现在,如果最后状态为“关闭”,我想获取应用程序列表。 仅将此应用程序添加到最后一个状态为“已关闭”的列表中。 注意:此应用程序未添加到至少有一个状态已关闭的列表中。
给定的打击代码是错误的。
$applicationsWithClosedStatus = Application::whereHas('statuses', function ($query) {
$query->where('status', 'closed');
})->get();
另一个错误
public function status() {
return $this->hasOne(Status::class)->latest ();
}
$applicationsWithLastClosedStatus = Application::whereHas('status', function ($query) {
$query->where('status', 'closed');
})->get();
答:
0赞
Tipu Sultan Eiko
11/7/2023
#1
试试这个
\DB::select("select id from applications where id in (select application_id from (select max(id), application_id from statuses where status="closed" group by application_id) AS t1)")
0赞
Denis Sinyukov
11/8/2023
#2
如果最后一个状态为“关闭”,则获取数据
SELECT s.*
FROM statuses as s
INNER JOIN applications as a on a.id = s.application_id
WHERE s.id IN (
SELECT MAX(s.id) as max_id
FROM statuses as s
GROUP BY s.application_id
) AND s.status = 'closed'
0赞
Chabi_Browny
11/8/2023
#3
我通常这样解决它: 在模型中,如扩展 Illuminate\Database\Eloquent\Model 的 ApplicationModel,将类似 your 的函数作为状态。 但像这样
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Model;
use ......\Status;
....
public function status(): HasMany
{
return $this->hasMany(Status::class);
}
现在你可以这样使用:
use ......\Application;
...
public function getApplicationWithStatus()
{
$application = new Application();
$result = $application::with('status')
->where('status', 'closed')
->get();
return $result !== null ? $result : false;
}
现在在结果中应该是预期的结果。 希望它有所帮助。
1赞
NAVEED SHAHZAD
11/23/2023
#4
我一直在使用最新的OfMany,取得了完美的效果。通过获取最后一个状态,我现在可以确定它是否已关闭。
public function applicationStatus(): HasOne
{
$this->hasOne(ApplicationStatus::class)->latestOfMany();
}
评论
hasOne(...)->latest();
hasOne(...)->latestOfMany();
Status
created_at
->whereHas('status', function ($query){ return $query->where('status', 'closed'); });
)