简体   繁体   中英

left join with 2 columns

I want to join two tables with two columns, It's working in phpmyadmin. But it's not working with laravel. So how to convert it in laravel structure.

SELECT 
    `j`.*,
    `ts`.*,
    `ps`.*,
    `pn`.*,
    `c`.*,
    `planner`.*,
    `ps`.`name` AS `section_name`,
    `ps`.`id` AS `section_id`,
    `planner`.`date` AS `planner_date`,
    `pn`.`id` AS `planner_note_id`
FROM
    `planner`
        INNER JOIN
    `timeslots` AS `ts` ON `ts`.`id` = `planner`.`timeslot_id`
        INNER JOIN
    `planner_sections` AS `ps` ON `ps`.`id` = `planner`.`planner_section_id`
        LEFT JOIN
    `planner_notes` AS `pn` ON `pn`.`date` = `planner`.`date` and `pn`.`contract_id` = `planner`.`contract_id`
        INNER JOIN
    `contracts` AS `c` ON `c`.`id` = `planner`.`contract_id`
        INNER JOIN
    `jobs` AS `j` ON `j`.`contract_id` = `c`.`id`
WHERE
    `c`.`id` = 57        
        AND MONTH(`planner`.`date`) = 6
        AND `planner`.`date` >= '2017-06-13'
        AND `planner`.`deleted_at` IS NULL
ORDER BY `planner`.`date` ASC

But when i put it in laravel query structure it's not working.

$planner_list = Planner::join("timeslots as ts","ts.id","planner.timeslot_id")
                ->join("planner_sections as ps","ps.id","planner.planner_section_id")
                ->leftJoin("planner_notes as pn","pn.date","planner.date")
                ->leftJoin("planner_notes as pn","pn.contract_id","planner.contract_id")
                ->join("contracts as c","c.id","planner.contract_id")
                ->join("jobs as j","j.contract_id","c.id")
                ->where('c.id','=',$contract_id)
                ->where('planner.date','>=',$current_date)
                ->whereMonth('planner.date',$current_month)
                ->select(['j.*','ts.*','ps.*','pn.*','c.*','planner.*','ps.name as section_name','ps.id as section_id','planner.date as planner_date','pn.id as planner_note_id'])
                ->orderBy('planner.date','ASC')
                ->orderBy('planner.timeslot_id','ASC')
                ->orderBy('section_id','ASC')
                ->get();

Above conversation isn't working for me.

It's also not working with ,

->leftJoin("planner_notes as pn","pn.date","planner.date","pn.contract_id","planner.contract_id")

Edit :- No I'm not getting any errors for it. it just considering last On condition.

ON `pn`.`contract_id` = `planner`.`contract_id`

I have one more confusion that if I write two leftjoin then On condition can overwrite or not ?

EDIT-2 :- It only returns last on condition. Query from query log is :-

SELECT 
    `j`.*,
    `ts`.*,
    `ps`.*,
    `pn`.*,
    `c`.*,
    `planner`.*,
    `ps`.`name` AS `section_name`,
    `ps`.`id` AS `section_id`,
    `planner`.`date` AS `planner_date`,
    `pn`.`id` AS `planner_note_id`
FROM
    `planner`
        INNER JOIN
    `timeslots` AS `ts` ON `ts`.`id` = `planner`.`timeslot_id`
        INNER JOIN
    `planner_sections` AS `ps` ON `ps`.`id` = `planner`.`planner_section_id`
        LEFT JOIN
    `planner_notes` AS `pn` ON `pn`.`contract_id` = `planner`.`contract_id`
        INNER JOIN
    `contracts` AS `c` ON `c`.`id` = `planner`.`contract_id`
        INNER JOIN
    `jobs` AS `j` ON `j`.`contract_id` = `c`.`id`
WHERE
    `c`.`id` = 57        
        AND MONTH(`planner`.`date`) = 6
        AND `planner`.`date` >= '2017-06-13'
        AND `planner`.`deleted_at` IS NULL
ORDER BY `planner`.`date` ASC

在此处输入图片说明

You could do

->leftJoin('planner_notes as pn', function($join){
            $join->on('pn.date', '=', 'planner.date');
            $join->on('pn.contract_id','=','planner.contract_id');    
        })

or

change alias of table as

->leftJoin("planner_notes as pn","pn.date",'=',"planner.date")
->leftJoin("planner_notes as pnotes","pnotes.contract_id",'=',"planner.contract_id")

Laravel join with multiple condition

LEFT JOIN
    `planner_notes` AS `pn` ON `pn`.`date` = `planner`.`date` and `pn`.`contract_id` = `planner`.`contract_id`

it's equivalent to:

->leftJoin('planner_notes as pn', function($join){
            $join->on('pn.date', '=', 'planner.date');
            $join->on('pn.contract_id','=','planner.contract_id'); 
        })

laravel.com Ref: method_on

Add an "on" clause to the join.

On clauses can be chained, eg

$join->on('contacts.userid', '=', 'users.id') ->on('contacts.infoid', '=', 'info.id')

will produce the following SQL:

on contacts.user_id = users.id and contacts.info_id = info.id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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