Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 4 雄辩的模型ID与联接不匹配_Laravel 4_Eloquent - Fatal编程技术网

Laravel 4 雄辩的模型ID与联接不匹配

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(); 问题

我有以下数据库架构: 人员1-1联系人1-*地址

还有另一个实体是联系人,因此表联系人是必需的

我访问了如下人员列表:

$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 . '%');