Laravel Eloquent指定字段查询时,自定义属性何时触发数据库查询?
问题解答
核心结论
Laravel 不会自动去数据库获取payment、total、active这些未查询的字段,也不会产生额外的N+1查询。你看不到额外查询的原因是:Eloquent根本没发起额外请求——模型实例里只有你通过select指定的id、title、date三个字段的数据,其他未查询的字段会返回null(布尔型字段默认是false)。
这会导致你的自定义属性status计算逻辑完全失效:比如$this->payment和$this->total都是null,$this->active是false,最终永远返回"unpaid",和数据库里的真实状态无关。
解决方法:一次查询搞定的方案
要让自定义属性能正确计算,同时避免额外查询,只需要在select里把自定义属性依赖的所有字段加进去即可:
$tickets = Tickets ::select('id', 'title', 'date', 'payment', 'total', 'active') // 补充依赖字段 ->limit(100) ->get();
这样一次查询就能获取所有需要的数据,遍历集合时访问$ticket->status会直接用内存中的数据计算,不会再和数据库交互。
如果你的Ticket模型字段不多,也可以用select('*')查询所有字段,但从性能角度来说,明确列出需要的字段更优。
内容的提问来源于stack exchange,提问作者Lannalina
相关产品推荐
相关产品推荐

