В настоящее время у меня есть SQL-запрос, с которым мне сегодня помог фантастический член stackoverflow. На данный момент это работает абсолютно нормально и так, как я хочу, чтобы это работало.
Единственная проблема — это RAW SQL, и мне бы очень хотелось, чтобы это работало с Laravel Query Builder.
Извините, это редактирование — вот оригинальный запрос:
$addresses = DB::select(
DB::raw('
(SELECT
"Company" AS object_type_name,
companies.company_name AS object_name,
addresses.*
FROM
addresses
INNER JOIN
companies
ON
addresses.object_id = companies.id
WHERE
addresses.object_type = 2)
UNION ALL
(SELECT
"Job" AS object_type_name,
jobs.job_title AS object_name,
addresses.*
FROM
addresses
INNER JOIN
jobs
ON
addresses.object_id = jobs.id
WHERE
addresses.object_type = 4)
'));
Вот код, который у меня есть:
$bindings = array(
'soft_deleted' => 0,
'user' => 1,
'company' => 2,
'candidate' => 3,
'job' => 4,
);
$companies = DB::table('addresses')->select(
'addresses.*',
'companies.company_name as object_name'
)->where('addresses.soft_deleted', '=', 0)->join('companies', function($join) use ($bindings){
$join->on('addresses.object_id', '=', 'companies.id')
->where('addresses.object_type', '=', $bindings['company']);
});
$jobs = DB::table('addresses')->select(
'addresses.*',
'jobs.job_title as object_name'
)->join('jobs', function($join) use ($bindings){
$join->on('addresses.object_id', '=', 'jobs.id')
->where('addresses.object_type', '=', $bindings['job']);
});
$addresses = $companies->unionAll($jobs)->get();
С кодом выше я получаю следующую ошибку:
SQLSTATE [HY093]: неверный номер параметра (SQL: (выберите addresses
,, companies
,company_name
как object_name
от addresses
внутреннее соединение companies
на addresses
,object_id
знак равно companies
,id
а также addresses
,object_type
= 2 где addresses
,soft_deleted
= 0) объединить все (выберите addresses
,, jobs
,job_title
как object_name
от addresses
внутреннее соединение jobs
на addresses
,object_id
знак равно jobs
,id
а также addresses
,object_type
знак равно
Я потратил много часов на поиски, но не могу найти ответ на эту маленькую проблему.
Мне удалось это исправить. Это было так же просто, как удаление ->where
изнутри каждого замыкания объединения и связывания его с самим объединением, а не с вложением.
До:
$companies = DB::table('addresses')->select(
'addresses.*',
'companies.company_name as object_name'
)->where('addresses.soft_deleted', '=', 0)->join('companies', function($join) use ($bindings){
$join->on('addresses.object_id', '=', 'companies.id')
->where('addresses.object_type', '=', $bindings['company']);
});
$jobs = DB::table('addresses')->select(
'addresses.*',
'jobs.job_title as object_name'
)->join('jobs', function($join) use ($bindings){
$join->on('addresses.object_id', '=', 'jobs.id')
->where('addresses.object_type', '=', $bindings['job']);
});
После:
$companies = DB::table('addresses')->select(
'addresses.*',
'companies.company_name as object_name'
)->where('addresses.soft_deleted', '=', 0)->join('companies', function($join){
$join->on('addresses.object_id', '=', 'companies.id');
})->where('addresses.object_type', '=', 2);
$jobs = DB::table('addresses')->select(
'addresses.*',
'jobs.job_title as object_name'
)->where('addresses.soft_deleted', '=', 0)->join('jobs', function($join){
$join->on('addresses.object_id', '=', 'jobs.id');
})->where('addresses.object_type', '=', 4);
$addresses = $companies->unionAll($jobs)->get();
Надеюсь, это кому-нибудь поможет.
Других решений пока нет …