简体   繁体   English

将参数绑定传递给Laravel查询生成器?

[英]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 ,。 companiescompany_nameobject_nameaddresses内部联接companiesaddressesobject_id = companiesidaddressesobject_type = 2,其中addressessoft_deleted = 0)UNION ALL(选择addresses jobsjob_titleobject_nameaddresses内参加jobsaddressesobject_id = jobsidaddressesobject_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM