[英]Passing parameter bindings to Laravel query builder?
I currently have a SQL query which a fantastic stackoverflow member helped me with earlier today. 我目前有一个SQL查询,这是一个出色的stackoverflow成员今天早些时候帮助我完成的。 At the moment it works absolutely fine and the way I want it to work.
目前,它的工作原理和我想要的工作方式都非常好。
The only problem is it's RAW SQL and I'd very much like to get this working with the Laravel Query Builder. 唯一的问题是它是RAW SQL,我非常想与Laravel Query Builder一起使用。
SORRY THIS IS AN EDIT - HERE IS THE ORIGINAL QUERY: 抱歉,这是一项编辑-这是原始查询:
$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)
'));
Here is the code I have so far: 这是我到目前为止的代码:
$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();
With the code above I'm getting the following error: 使用上面的代码,我得到以下错误:
SQLSTATE[HY093]: Invalid parameter number (SQL: (select addresses
. , companies
. company_name
as object_name
from addresses
inner join companies
on addresses
. object_id
= companies
. id
and addresses
. object_type
= 2 where addresses
. soft_deleted
= 0) union all (select addresses
. , jobs
. job_title
as object_name
from addresses
inner join jobs
on addresses
. object_id
= jobs
. id
and addresses
. object_type
= ?)) SQLSTATE [HY093]:无效的参数号(SQL:(选择
addresses
,。 companies
。 company_name
如object_name
从addresses
内部联接companies
上addresses
。 object_id
= companies
。 id
和addresses
。 object_type
= 2,其中addresses
。 soft_deleted
= 0)UNION ALL(选择addresses
, jobs
。 job_title
如object_name
从addresses
内参加jobs
的addresses
。 object_id
= jobs
。 id
和addresses
。 object_type
=?))
I've done hours worth of searching but I can't seem to find the answer to this little problem. 我已经花了几个小时进行搜索,但是似乎找不到这个小问题的答案。
I managed to fix it. 我设法解决了。 It was as simple as removing the
->where
from within each join closure and chaining it to the join itself and not nesting it. 就像从每个联接关闭中删除
->where
并将其链接到联接本身而不嵌套一样简单。
Before: 之前:
$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']);
});
After: 后:
$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();
Hope this helps someone. 希望这对某人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.