【问题标题】:Laravel - Eloquent query not returning relation via 'with'Laravel - 雄辩的查询不通过'with'返回关系
【发布时间】:2021-06-20 18:47:17
【问题描述】:

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

涉及的模型是 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, '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 时验证关系是否按预期工作。

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

编辑 使用 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 的角色()关系函数中被引用。

【问题讨论】:

  • 在进行一些额外的调试并使用 dd(DB::getQueryLog()) 查看查询后,我发现了可能的原因,并且仍在寻找解决方案。我在上面的问题中添加了这个:re: 数据透视表上的附加字段 w/roles 关系被请求为空。

标签: laravel eloquent relation


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2016-07-01
    • 2020-02-18
    • 2016-02-26
    • 1970-01-01
    • 2015-12-17
    • 2014-01-16
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多