You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在主模型带条件时查询一对多关联关系

问题解决办法

你的问题出在两个核心点上:

  1. 你用了$post->comments(已经加载到内存的评论集合)而非$post->comments()(数据库查询构造器)。集合的where方法是在内存里过滤已加载的数据,它不认识posts.updated_at这种数据库表列的写法,只会把它当成普通字符串来做比较。
  2. 直接把'posts.updated_at'作为比较值传入where,数据库会误以为你要找published字段大于等于字符串"posts.updated_at"的评论,同时因为你的查询没关联posts表,数据库自然找不到posts.updated_at这个列,所以报“Column not found”。

正确的写法应该用查询构造器,并且用whereColumn方法来指定两个数据库列的比较:

方法一:利用关联自动关联主表

$myComments = $post->comments()->whereColumn('published', '>=', 'posts.updated_at')->get();

因为你是从$post这个模型实例发起的关联查询,Laravel会自动处理posts表和comments表的关联,不用手动join。whereColumn的作用是告诉框架:我要比较两个数据库列的值,而不是列和某个固定值。

方法二:显式join主表(更清晰,适合复杂场景)

如果担心自动关联的表别名或者列冲突,可以手动join并指定字段:

$myComments = $post->comments()
    ->join('posts', 'posts.id', '=', 'comments.post_id')
    ->whereColumn('comments.published', '>=', 'posts.updated_at')
    ->select('comments.*') // 只选评论表的字段,避免posts和comments的同名字段冲突
    ->get();

关键提醒

  • 一定要用$post->comments()(带括号)来获取查询构造器,这样条件才会被翻译成SQL语句在数据库层面执行,而不是在内存里过滤已加载的数据。
  • 确保comments表的published字段和posts表的updated_at字段都是日期时间类型(比如datetime、timestamp),否则比较会出现逻辑错误。

内容的提问来源于stack exchange,提问作者Cutis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:07:47