Laravel - Eloquent 查询未通过 'with' 返回关系

Laravel - Eloquent query not returning relation via 'with'

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

涉及的模型有Person和Role。

Person 关系:

    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, 'person_role','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', 'LIKE', "%$query%")
                ->orWhere('person.login', 'LIKE', "%$query%")
                ->orWhere('person.personID', 'LIKE', "%$query%")
                ->orWhere('pe.emailADDR', 'LIKE', "%$query%")
                ->orWhere('op.OrgStat1', 'LIKE', "%$query%");
        })->distinct()->get();

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

上面的查询return在应该有数据的时候为空。我担心这可能是由于 select 查询引起的,但找不到任何表明这是否是问题所在以及如何补救的信息。

编辑 使用 dd(DB::getQueryLog()),我可以看到为 with 子句生成的查询要求在枢轴 table 上添加一个额外字段(这是必需的),但要求它的值为无效的。如果它没有从 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 时得到我期望的结果,但在应用程序本身却得不到。