如何从select
company
子查询中返回whereHas
数据?
$data = Job::where('active','=','1')
->whereHas('company', function($q) use ($distance_select) {
$q->where('active','=','1')
->select(DB::raw($distance_select))
->whereHas('user', function($q) {
$q->whereHas('group', function ($q) {
$q->whereIn('group.name_short', array('admin', 'moderator', 'subscriber'));
});
});
});
我从Job
模型中获取所有数据。我的原始查询从distance
子查询中返回company
值。
以下是感兴趣的人的子查询。
if ( $units == 'miles' ) {
$gr_circle_radius = 3959;
} elseif ( $units == 'kilometers' ) {
$gr_circle_radius = 6371;
}
$distance_select = sprintf(
"
ROUND(( %d * acos( cos( radians(%s) ) " .
" * cos( radians( lat ) ) " .
" * cos( radians( lng ) - radians(%s) ) " .
" + sin( radians(%s) ) * sin( radians( lat ) ) " .
" ) " .
")
, 2 ) " .
"AS distance
",
$gr_circle_radius,
$lat,
$lng,
$lat
);
一切正常,我只是希望能够访问子查询中返回的distance
。
------------ ------------加入
这里是原始查询的输出
select * from `job` where `active` = '1' and (select ROUND(( 3959 * acos( cos( radians(38.15499960) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-85.66808610) ) + sin( radians(38.15499960) ) * sin( radians( lat ) ) ) ) , 2 ) AS distance from `company` where `job`.`company_id` = `company`.`id` and `active` = '1' and (select count(*) from `users` where `company`.`user_id` = `users`.`id` and (select count(*) from `group` inner join `group_user` on `group`.`id` = `group_user`.`group_id` where `group_user`.`user_id` = `users`.`id` and `group`.`name_short` in ('admin', 'moderator', 'subscriber')) >= 1 and `users`.`deleted_at` is null) >= 1) >= 1 limit 10
答案 0 :(得分:1)
经过数小时的研究后计算出来。
这是新的工作代码
$data = Job::where('job.active','=',1)
->select(DB::raw("`job`.*, `company`.`lat` as `lat`, `company`.`lng` as `lng`, ROUND(( ? * acos( cos( radians(?) ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians(?) ) + sin( radians(?) ) * sin( radians( `lat` ) ) ) ) , 2 ) AS `distance`"))
->leftJoin('company', function($join) {
$join->on('job.company_id', '=', 'company.id');
})
->setBindings([$radius, $lat, $lng, $lat], 'select')
->whereHas('company', function($q) {
$q->where('active','=',1)
->whereHas('user', function($q) {
$q->whereHas('group', function ($q) {
$q->whereIn('group.name_short', array('admin', 'moderator', 'subscriber'));
});
});
});
以下是感兴趣的人的原始查询
select `job`.*, `company`.`lat` as `lat`, `company`.`lng` as `lng`, ROUND(( '3959' * acos( cos( radians('38.15499960') ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians('-85.66808610') ) + sin( radians('38.15499960') ) * sin( radians( `lat` ) ) ) ) , 2 ) AS `distance` from `job` left join `company` on `job`.`company_id` = `company`.`id` where `job`.`active` = '1' and (select count(*) from `company` where `job`.`company_id` = `company`.`id` and `active` = '1' and (select count(*) from `users` where `company`.`user_id` = `users`.`id` and (select count(*) from `group` inner join `group_user` on `group`.`id` = `group_user`.`group_id` where `group_user`.`user_id` = `users`.`id` and `group`.`name_short` in ('admin', 'moderator', 'subscriber')) >= 1 and `users`.`deleted_at` is null) >= 1) >= 1 limit 10