Laravel 5.8+Livewire跨ABKs、Parts双表搜索报列不存在如何解决
错误原因
你使用的with()方法是Eloquent的预加载关联功能,本质是分两次查询:
- 第一次仅查询
abks表符合where条件的记录 - 第二次根据第一次查询得到的
abks.part_id批量查询parts表的关联数据,再把关联结果挂载到ABK模型对象上
所以第一次查询abks表的时候,parts表并没有被关联,自然找不到parts.zeichnungsnummer字段,抛出字段不存在错误。
解决方案
基础关联筛选写法
如果仅需要按关联表条件筛选,不需要按关联表字段排序,直接用whereHas方法即可实现你要的查询逻辑,对应你的原生SQL:
$abks = ABK::whereHas('part', function($query) { $query->where('zeichnungsnummer', 'like', '%46%'); })->with('part')->get();
兼容搜索、排序、分页的Livewire完整实现
针对你两个搜索框+排序+分页的需求,推荐手动写leftJoin的方式,灵活性更高,支持按parts表字段排序:
- 首先在Livewire组件中定义需要的公共属性:
// ABKs表搜索关键词 public $searchAbk = ''; // Parts表搜索关键词 public $searchPart = ''; // 排序字段,默认按abks.id排序 public $sortField = 'id'; // 排序方向 public $sortDirection = 'asc';
- 在render方法中编写查询逻辑:
public function render() { $abks = ABK::query() // 执行left join关联parts表 ->leftJoin('parts', 'abks.part_id', '=', 'parts.id') // 指定查询字段,避免两表同名字段覆盖 ->select('abks.*', 'parts.zeichnungsnummer as part_zeichnungsnummer') // ABKs表搜索逻辑,将where条件里的字段替换为你实际要搜索的ABKs表字段即可 ->when($this->searchAbk, function($query) { $query->where('abks.xxx_field', 'like', "%{$this->searchAbk}%"); }) // Parts表搜索逻辑 ->when($this->searchPart, function($query) { $query->where('parts.zeichnungsnummer', 'like', "%{$this->searchPart}%"); }) // 排序逻辑,支持按parts字段排序,比如要按zeichnungsnummer排序的话,sortField设为part_zeichnungsnummer即可 ->orderBy($this->sortField, $this->sortDirection) // 分页,参数可自定义每页条数 ->paginate(10); return view('livewire.你的组件视图名', compact('abks')); }
注意事项
- 如果使用join方式,两表存在同名字段(比如id、created_at等)必须通过
select加别名区分,避免查询结果被覆盖 - 若不需要按parts表字段排序,可以保留
whereHas写法,语法更简洁,不需要手动处理字段冲突 - Livewire中可以在
paginate后链式调用->withQueryString(),将搜索、排序、分页参数同步到URL,方便页面刷新后保留状态
内容的提问来源于stack exchange,提问作者loomy
相关产品推荐
相关产品推荐

