2017-01-18 104 views
1

我在通知和alerFrequencies表之间有一对多的关系。他们都有模型。我写了这个函数从alerFrequencies表中提取所有最新的created_at时间戳。Laravel:一对多关系只返回一条记录

例如,如果我的通知表中有一个网站,并且在警报表中有created_at时间戳记,它应该只返回最新的时间戳记。如果我在通知表中有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。

+0

我不知道你要做什么。上述查询将只返回1个alert_frequency和** only **表中的created_at字段。这两部分在你的查询中完全没有任何用处:'​​:: with('notification')''''> groupBy('created_at')'。如果您在选择(或任何您的外键)中不包含'id',则无法加载关系。由于您只选择最新的(' - > first()')'created_at'字段,所以group by将不会分组。 – devk

+0

当然,它只返回一个,因为在你的查询中你只选择第一个,在你的查询结束 - > first()选择第一条记录,将其更改为 - > get() –

+0

@Levente Nagy给我错误:未定义的属性:Illuminate \ Database \ Eloquent \ Collection :: $ created_at –

回答

0

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

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

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

然后,你可以通过做$notification->last_timestamp,假设$notification是在看你的对象很容易地访问最新的时间戳每个通知。

+0

tnx非常多....它花了我大约一个星期,无法弄清楚。你救了我......真的很感谢你 –

+0

解决方案工作正常,我应该问你一个问题。如果想要为所有网站自动插入created_at方法到lertFrequency表中,我该怎么办? –

+0

你的意思是将它插入到数据库中或在记录创建时插入到数据库中?或检索值? – xhulio