我使用的是Laravel 9.39.0, php 8.1, mysql 8.0.31.
我的目标是添加一个作用域来过滤模型,其中user_id引用的用户已经被归档或以某种方式过滤了。用户的过滤在另一个作用域中完成。
仅在作用域中使用$builder->has('user');
就可以了,但是eloquent将使用一个不那么高效的exists查询。(这将在以后的多态关系中工作,这是性能影响非常明显的地方)。所以我尝试创建一个连接,而不是有,这将是更有效的。它在索引视图上工作得很好,但当我试图显示单个模型时,我得到:"**完整性约束违反:1052列'id'在where子句是含糊不清的"。**如果我在模型控制器中转储show-function的查询,我可以看到它尝试:where id = ? limit 1
和id没有以模型名称为前缀,从而导致错误。
即使下面这个作用域内的基本代码也会产生错误。
builder->leftJoin('users', 'users.id', 'projects.user_id')
以上代码生成以下查询:
select * from `projects` left join `users` on `users`.`id` = `projects`.`user_id` where `id` = ? limit 1
是否有一种方法可以强制eloquent在查询中添加表名的前缀?
谢谢你的阅读,我希望你能帮助。
我已经尝试了很长时间的谷歌搜索,我试图使用雄辩的力量加入包,但它没有工作…
您可以使用:
$builder->leftJoin('users', 'users.id', 'projects.user_id')->where("users.id",1);