在eloquent中获取满足条件的最后一个元素

时间:2017-10-17 16:02:27

标签: php laravel eloquent subquery

我有2个模型,Queue和Action。

队列有许多操作,这些操作可能是待处理,重定向,完成等等。

我为给定队列的每个动作添加一个动作。

因此,只要我添加一个队列对象,第一个动作就是'Pending'。

我需要检索其最后一个操作是Pending(status_id = 1)还是Redirected(status_id = 5)的队列

我的表格看起来像这样

qms_queue ID

qms_actions id status_id queue_id

我的方法是这样的:

$queue_query->whereHas('actions', function ($query) {
            $query->where('id', function ($query2) {
                $query2->from('qms_actions')
                    ->select('id')
                    ->orderBy('created_at', 'desc')
                    ->limit(1);
            });
        })->whereIn('status_id', [1,5]);

但是我检索到status_id为1或5但不是给定队列的最后一个的动作,因此,返回每个队列。

我无法弄清楚如何在雄辩中做到这一点。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

尝试这样,如果可以加载没有想要的操作的队列:

$queue_query->with('actions', function ($query) {
            $query->whereIn('status_id', [1,5]);
            $query->orderBy('created_at', 'desc');
            $query->limit(1);
        });

试试这个:

$queues = $queue_query->whereHas('actions', function ($query) {
            $query->where('id', function ($query2) {
                $query2->from('qms_actions')
                    ->select('id')
                    ->orderBy('created_at', 'desc')
                    ->whereIn('status_id', [1,5]);
                    ->limit(1);
            });
        })->get();

你可以这样做:

foreach ($queues as $queue) {
    //$queue->actions->first();
}