【发布时间】:2020-10-07 04:47:05
【问题描述】:
我有以下型号: 1- 用户模型
/**
* Define user and functional area relationship
*/
public function functionalAreas()
{
return $this->belongsToMany('App\FunctionalArea', 'user_functional_areas', 'user_id', 'functional_area_id')->withPivot('id', 'is_primary')->withTimestamps();
}
和商业模式:
/**
* Define business and user functional area relationship
*/
public function functionalAreas()
{
return $this->belongsToMany('App\FunctionalArea', 'business_functional_areas', 'business_id', 'functional_area_id')->withTimestamps();
}
现在我应该将所有企业和用户显示在一个列表中,为此我从联合中使用,以下是我的查询:
public function usersAndOrganizations()
{
$users = $this->users();
$organizations = $this->organizations();
$invitees = $users->union($organizations)->paginate(10);
return response()->json($invitees);
}
private function users()
{
$users = User::byState($approved = true, 'is_approved')
->search()->select([
'id',
DB::raw("CONCAT(first_name, ' ', last_name) AS name"),
'about',
'address',
'slug',
'average_reviews',
DB::raw("'freelancer' AS type")
]);
$users = $users->with([
"functionalAreas" => function ($q) {
$q->select([
'functional_areas.id',
DB::raw("functional_areas.name_en AS name"),
]);
}
]);
return $users;
}
private function organizations()
{
$businesses = Business::where('owner_id', '!=', auth()->user()->id)->verified()
->active()->search()
->select([
'id',
'name',
'about',
'address',
'slug',
'average_reviews',
DB::raw("'business' AS type")
]);
$businesses = $businesses
->with([
"functionalAreas" => function ($q) {
$q->select([
'functional_areas.id',
DB::raw("functional_areas.name_en AS name"),
]);
}
]);
return $businesses;
}
但上面的查询不返回业务功能区,其输出查询使用用户关系而不是业务,with 部分生成两次以下查询:
select
`functional_areas`.`id`,
functional_areas.name_en AS name,
`user_functional_areas`.`user_id` as `pivot_user_id`,
`user_functional_areas`.`functional_area_id` as `pivot_functional_area_id`,
`user_functional_areas`.`id` as `pivot_id`,
`user_functional_areas`.`is_primary` as `pivot_is_primary`,
`user_functional_areas`.`created_at` as `pivot_created_at`,
`user_functional_areas`.`updated_at` as `pivot_updated_at`
from `functional_areas`
inner join `user_functional_areas`
on `functional_areas`.`id` = `user_functional_areas`.`functional_area_id`
where `user_functional_areas`.`user_id` in (2, 6, 7)
但实际上 6 和 7 是企业 ID 而不是用户只有 2 是用户 ID,其中一个查询应该使用 business_functional_areas 而不是 user_functional_areas。
发现的另一件事是,结果中的所有项目都在App\User 模型中,它像businesses 也是作为用户对象。
【问题讨论】:
-
你在 :private function users 中有错字)应该是 users()
-
能否将最终查询的结果用
->toSql( )输出并分享? -
我怀疑
DB::raw("CONCAT(first_name, ' ', last_name) AS name"),和DB::raw("functional_areas.name_en AS name"),存在冲突。为两者使用不同的name别名 -
我认为你不能在 laravel 中混合使用 UNION 和急切加载 (
with)。执行 UNION 查询后,laravel 不知道 id 来自哪个表。恐怕您将不得不实现自己的急切加载逻辑或使用延迟加载(这不会是 10 条记录的世界末日)。 -
@jones,如果您能与我们共享数据库模式,那就太好了。等待你的答复。您可以创建一个fiddle,并附上一些数据以便快速了解。
标签: php mysql laravel eloquent laravel-6