laravel 应用程序列表(如果上次状态为关闭)

laravel list of Applications if last status is closed

提问人:NAVEED SHAHZAD 提问时间:11/7/2023 最后编辑:Tipu Sultan EikoNAVEED SHAHZAD 更新时间:11/8/2023 访问量:67

问:

上次状态 已关闭的应用程序

用户 表 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();
php mysql 拉维尔

评论

0赞 Karl Hill 11/7/2023
为了澄清这一点,您需要一个最后一个状态为“已关闭”的应用程序列表,并排除至少一个状态为“已关闭”的应用程序?
1赞 Tim Lewis 11/7/2023
而不是 ,我认为您需要使用 ,这将返回与您的模型的单一模型关系,基于 ,然后应该使用 (文档:laravel.com/docs/10.x/eloquent-relationships#has-one-of-manyhasOne(...)->latest();hasOne(...)->latestOfMany();Statuscreated_at->whereHas('status', function ($query){ return $query->where('status', 'closed'); });)

答:

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();
}