Laravel:一对多关系只返回一条记录

时间:2017-01-18 14:27:25

标签: php laravel laravel-5.3

我在通知和alerFrequencies表之间有一对多的关系。他们有两种模式。我编写了这个函数来从alerFrequencies表中提取所有最新的created_at时间戳。

例如,如果我的通知表中有一个网站,警报表中有created_at个时间戳,它应该只返回最新的时间戳。如果我在通知表中有2个具有不同时间戳的网站,它应该返回2个网站的时间戳。

此处只返回最新信息,无论通知表中的网站数量是多少。一个谁有更好的想法来编写查询,我会感谢各种帮助和建议。

public function alert(){
        $alert_timestamp = AlertFrequency::with('notification')->select('created_at')->groupBy('created_at')->orderBy('created_at','DESC')->first();
        $alert_timestamp=$alert_timestamp->created_at->toDateTimeString();
        if($alert_timestamp==null){
            return false;
        }       
            return $alert_timestamp;
    }

在数据库中我必须使用表通知和alerFrequencies表,具有一对多的关系。 notification_id是alertFreqency表中的外键。通知有列:是,网站网址和alertFrequencies有:id。 notification_id和created_at。现在我想获取通知表中每个网站的最新created_at。

1 个答案:

答案 0 :(得分:0)

有些事情你做错了。首先,您要查询AlertFrequency::with('notification'),而根据我的理解,您可能需要Notification::with('alertfrequencies')之类的内容。第二件事是你只选择一列。只选择一列会使with函数无效。你做错的第三件事是按created_at列进行分组。这根本不能满足您的需求。你必须groupBy('notification_id')。我写了上面的解释,这样你就可以更好地理解你的应用程序的逻辑,而我在下面给出了一个可能的解决方案。

鉴于您希望每个网站的通知的最新时间戳,那么可能的方法是在您的Notification模型中添加访问者。

public function getLastTimestampAttribute(){
    return AlertFrequency::where('notification_id', $this->attributes['id'])->order_by('created_at','desc')->first()->created_at;
}

然后,您可以通过$notification->last_timestamp轻松访问每个通知的最新时间戳,假设$notification是您在视图中的对象。