【发布时间】: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 关系被请求为空。