【问题标题】:Laravel: one to many relationship returns only one recordLaravel:一对多关系只返回一条记录
【发布时间】:2017-06-02 23:35:16
【问题描述】:

我在通知和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 表中的外键。通知有列:是,网站 url 和 alertFrequencies 有:id。 notification_id 和 created_at。现在我想为通知表中的每个网站获取最新的 created_at。

【问题讨论】:

  • 我不知道你想做什么。上述查询将仅返回 1 个 alert_frequency 和 表中的 created_at 字段。这两个部分在您的查询中完全没有任何作用:::with('notification')->groupBy('created_at')。如果您没有在选择中包含id(或任何您的外键),您将无法加载关系。并且 group by 不会对任何内容进行分组,因为您只选择最新的 (->first()) created_at 字段。
  • 当然它只返回一个,因为在您的查询中您只选择第一个,在查询结束时 ->first() 选择第一条记录,将其更改为 ->get()
  • @Levente Nagy 得到它给我错误:未定义的属性:Illuminate\Database\Eloquent\Collection::$created_at
  • 可以显示数据库吗?
  • 我应该在聊天中给你看数据库还是?

标签: php laravel laravel-5.3


【解决方案1】:

您做错了一些事情。首先,您正在查询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 是您在视图中的对象。

【讨论】:

  • tnx 非常...。我花了大约一个星期才弄明白。你救了我……真的很感谢你
  • 解决方案工作正常,我可以问你一个问题吗?如果想为所有网站自动插入 created_at 方法到 lertFrequency 表中该怎么办?
  • 您的意思是在创建记录时将其插入数据库或插入数据库?还是检索值?
  • 我的意思是在需要自动插入时插入数据库?
  • 如果你已经正确构建了你的数据库,那么就不需要插入 created_at 因为它是自动创建的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2012-11-26
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多