Laravel 5.6多态关联中whereHas无法生效问题求助
解决Laravel 5.6多态关联中whereHas无法正常工作的问题
看起来你在Laravel 5.6的多态关联场景下使用whereHas时遇到了报错,结合多态关联的常见坑,我来帮你分析可能的问题和解决办法。
首先,先确认你的多态关联定义是否正确。假设你的Order模型里的part是一个morphTo关联(多态关联的核心定义),正确的关联写法应该是这样的:
class Order extends Model { // 多态关联:订单属于某个"part"(比如Product、Service等不同模型) public function part() { return $this->morphTo(); } // 你的获取订单方法 public static function getAllOrders() { return Order::with('part.pcategory') ->whereHas('part', function ($query) { // 这里假设你要筛选part的cat_id等于某个值,比如示例中的1 $query->where('cat_id', 1); })->get(); } }
常见错误点及解决办法
1. 多态关联字段不匹配
Laravel默认的多态关联字段规则是{关联名}_id和{关联名}_type——比如你的关联叫part,那么orders表必须有part_id(存储关联模型的ID)和part_type(存储关联模型的类名,比如App\Product)两个字段。如果你的表字段名不是这个规则(比如用了item_id和item_type),需要在关联定义里手动指定:
public function part() { return $this->morphTo(null, 'item_type', 'item_id'); }
2. whereHas闭包里的字段不存在或写错
如果part对应的目标模型(比如Product)没有cat_id字段,或者你把字段名写错了(比如把category_id写成cat_id),执行where('cat_id', ...)肯定会报错。先确认目标模型里确实存在这个字段,或者修正字段名。
3. 目标模型未定义反向关联
虽然这不会直接导致whereHas报错,但如果你的part模型(比如Product)没有定义反向的morphMany关联,可能会引发一些隐性问题,建议补上:
class Product extends Model { public function orders() { return $this->morphMany(Order::class, 'part'); } }
4. 调试生成的SQL语句
如果还是报错,建议用toSql()方法查看生成的SQL,直观排查问题:
$query = Order::with('part.pcategory') ->whereHas('part', function ($query) { $query->where('cat_id', 1); }); dd($query->toSql()); // 打印SQL,检查表名、字段名是否正确
通过生成的SQL,你能快速发现是不是多态类型筛选有误、字段名写错,或者关联的表没有正确关联。
内容的提问来源于stack exchange,提问作者Hadi.M
相关产品推荐
相关产品推荐

