微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel - Eloquent 查询不通过“with”返回关系

如何解决Laravel - Eloquent 查询不通过“with”返回关系

我有以下查询应该返回关系但不是。

所涉及的模型是 Person 和 Role。

人物关系:

    public function roles()
    {
        return $this->belongsToMany(Role::class,'person_role','user_id','role_id')
            ->where('person_role.org_id',$this->defaultOrgID);
    }

角色关系:

    public function people()
    {
        return $this->belongsToMany(Person::class,'role_id','user_id');
    }

麻烦的查询

    $persons = Person::with('roles')
        //->selectRaw('person.personID,person.lastName,person.firstName,person.login,op.OrgStat1,person.defaultOrgID')
        ->select('person.personID','person.lastName','person.firstName','person.login','op.OrgStat1','person.defaultOrgID')
        ->leftJoin('person-email as pe','pe.personID','=','person.personID')
        ->leftJoin('org-person as op','op.personID',DB::raw('person.personID and op.orgID = ' . $this->currentPerson->defaultOrgID))
        ->leftJoin('role_user as ru','ru.user_id',DB::raw('person.personID AND ru.orgID = ' . $this->currentPerson->defaultOrgID .
            ' AND EXISTS (select roles.name from roles where roles.id = ru.role_id and roles.name ="%' . $query . '%")'))
        ->orWhere(function ($q) use ($query) {
            $q->orWhere('person.firstName','LIKE',"%$query%")
                ->orWhere('person.lastName',"%$query%")
                ->orWhere('person.login',"%$query%")
                ->orWhere('person.personID',"%$query%")
                ->orWhere('pe.emailADDR',"%$query%")
                ->orWhere('op.OrgStat1',"%$query%");
        })->distinct()->get();

我已经使用 tinker 进行了测试,并且可以验证在抓取 Person 记录和使用 $p->roles 时关系是否按预期工作。

上面的查询在应该有数据时返回 null。我担心这可能是由于 select 查询造成的,但找不到任何表明这是否是问题或如何解决的信息。

编辑 使用 dd(DB::getQueryLog()),我可以看到为 with 子句生成查询要求数据透视表上的额外字段(这是必需的),但要求它的值为 null。如果没有从 Person 的关系定义中提取它,我该如何指定它应该是什么?

生成查询

        "query" => "select `roles`.*,`person_role`.`user_id` as `pivot_user_id`,`person_role`.`role_id` as `pivot_role_id` from `roles` inner join `person_role` on `roles`.`id` = `person_role`.`role_id` where `person_role`.`org_id` is null and `person_role`.`user_id` in (1) ◀"

我可以验证 $this->defaultOrgID 确实有一个非空值,该值在 Person 中的 roles() 关系函数中引用。

解决方法

我偶然发现了 this question 并在那里实施了解决方案 - 以描述的方式创建自定义数据透视模型,它似乎提供了预期的数据。

我仍然不知道为什么我可以在使用 tinker 时得到我期望的结果,而不是在应用程序本身中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。