Laravel 4 雄辩的模型ID与联接不匹配
我有以下数据库架构: 人员1-1联系人1-*地址 还有另一个实体是联系人,因此表联系人是必需的 我访问了如下人员列表:Laravel 4 雄辩的模型ID与联接不匹配,laravel-4,eloquent,Laravel 4,Eloquent,我有以下数据库架构: 人员1-1联系人1-*地址 还有另一个实体是联系人,因此表联系人是必需的 我访问了如下人员列表: $persons = Person::with('contact.addresses') ->filter($string) ->withoutCompany() ->orderBy('persons.surname', 'ASC') ->get(); 问题
$persons = Person::with('contact.addresses')
->filter($string)
->withoutCompany()
->orderBy('persons.surname', 'ASC')
->get();
问题是返回的雄辩模型用表联系人的id覆盖了person的id字段。这是由于查询范围筛选器($string)造成的,如下所示:
public function scopeFilter($query, $parameter) {
return $query
->join('contacts', 'persons.contact_id', '=', 'contacts.id')
->join('addresses', 'addresses.contact_id', '=', 'contacts.id')
->where(function($q) use($parameter) {
$q->where('addresses.city', 'like', $parameter)
->orWhere('persons.surname', 'like', '%' . $parameter . '%')
->orWhere('persons.name', 'like', '%' . $parameter . '%')
->orWhere('addresses.postcode', 'like', $parameter . '%');
});
}
public function scopeWithoutCompany($query) {
return $query->whereRaw('persons.id not in (select company_person.person_id from company_person)');
}
这个问题已经得到解决
它指出应该使用select语句,因为如果多次选择相同的列名,则在使用联接填充雄辩的模型时,最后一个列名将覆盖前导。
但是,当我在查询范围中使用select语句时,例如,仅选择人员。*
和地址。*
-我得到了一个基数冲突:1241个操作数应该包含23列
错误,来自另一个模型,在该模型中,我在急切加载约束中使用范围(人员和地址一起有23列)
我通过一个丑陋的解决方法解决了这个问题,在Persons表上再次加入,作为最后一个加入,用person id覆盖id。但这不能解决我的问题。有人知道我怎么解决这个问题吗
这是my Person::filter($string)查询范围的解决方法:
return $query
->select(array('persons.*', 'addresses.*'))
->join('contacts', 'persons.contact_id', '=', 'contacts.id')
->join('addresses', 'addresses.contact_id', '=', 'contacts.id')
->join('persons as p', 'p.id', '=', 'persons.id')
->where(function($q) use($parameter) {
$q->where('addresses.city', 'like', $parameter)
->orWhere('persons.surname', 'like', '%' . $parameter . '%')
->orWhere('persons.name', 'like', '%' . $parameter . '%')
->orWhere('addresses.postcode', 'like', $parameter . '%');
});
供参考:
这是导致基数冲突错误的代码(数据库sehcma是Company*-*Person):
感谢Laravel.io上的用户Kindari,我现在有了一个解决方案。 我并没有直接在地址表上设置条件,但在地址模型的查询范围中有where子句 在查询范围内的Persn模型中,我首先检索所有相关的地址。我将身份证放在一个列表中,并将我的个人限制为仅居住在这些地址的人。有了这个,我还有一个查询,但根本没有连接。请参见下面的解决方案
public function scopeFilter($query, $parameter) {
$contact_ids = Address::filter($parameter)->lists('contact_id');
$query->with('contact')
->where(function($q) use ($parameter, $contact_ids) {
$q->where('persons.surname', 'like', '%' . $parameter . '%')
->orWhere('persons.name', 'like', '%' . $parameter . '%');
if($contact_ids) {
$q->orWhereIn('contact_id', $contact_ids);
}
});
return $query;
}
这部分
$q->where('addresses.city', 'like', $parameter)
->orWhere('addresses.postcode', 'like', $parameter . '%');
现在是地址模型查询范围的一部分
封装得很好。我不知道为什么我没有想到这一点。不知怎么的,我把注意力集中在一个问题上。这就解决了我的问题。为什么不使用雄辩的关系呢?这让你的生活变得轻松多了(:你能举一个例子,说明一个有说服力的关系,其结果与我上面的过滤器相同吗?如果我是对的,我需要使用wherehads,但我无法将该约束放在addresses表上,因为它与Person没有直接关系
$q->where('addresses.city', 'like', $parameter)
->orWhere('addresses.postcode', 'like', $parameter . '%');