【问题标题】:Laravel & MySQL having a join on a join?Laravel 和 MySQL 在连接上有连接?
【发布时间】:2018-12-25 16:14:59
【问题描述】:

我需要在已连接的表上连接一个表,因为我需要的另一个表中的数据也分布在另一个表中。到目前为止,这是我的 SQL 模型:

现在我还需要加入地址表和加入的子表,因为我还需要每个孩子的地址。我唯一的问题是,如何根据 childs.address_id 加入表地址?

我已经尝试过了:

INNER JOIN `addresses` AS `addresse_child` ON `childs`.`address_id` = `addresses`.`id`

很遗憾没有工作..

到目前为止我的 SQL 查询 (DB::getQueryLog())

SELECT `assignments`.`id` AS `assignment_id`,
       `assignments`.`persons` AS `assignment_persons`,
       `assignments`.`start_date` AS `assignment_start_date`,
       `assignments`.`end_date` AS `assignment_end_date`,
       `addresses`.`id` AS `address_id`,
       `addresses`.`first_name` AS `address_first_name`,
       `addresses`.`last_name` AS `address_last_name`,
       `addresses`.`company` AS `address_company`,
       `childs`.`id` AS `child_id`,
       `childs`.`address_id` AS `child_address_id`,
       `childs`.`sibling_id` AS `child_sibling_id`,
       `childs`.`height` AS `child_height`,
       `childs`.`weight` AS `child_weight`
FROM `assignments`
INNER JOIN `addresses` ON `assignments`.`address_id` = `addresses`.`id`
INNER JOIN `childs` ON `assignments`.`id` = `childs`.`assignment_id`
WHERE `assignments`.`deleted_at` IS NULL
  AND `addresses`.`deleted_at` IS NULL
  AND `childs`.`deleted_at` IS NULL

我的 Laravel SQL 命令:

$assignment_data =  DB::table('assignments')
            ->join('addresses', 'assignments.address_id',  '=', 'addresses.id')
            ->join('childs', 'assignments.id',  '=', 'childs.assignment_id')
            ->select(
                'assignments.id as assignment_id',
                'assignments.persons as assignment_persons',
                'assignments.start_date as assignment_start_date',
                'assignments.end_date as assignment_end_date',
                'addresses.id as address_id',
                'addresses.first_name as address_first_name',
                'addresses.last_name as address_last_name',
                'addresses.company as address_company',
                'childs.id as child_id',
                'childs.address_id as child_address_id',
                'childs.sibling_id as child_sibling_id',
                'childs.height as child_height',
                'childs.weight as child_weight'

            )
            ->whereNull('assignments.deleted_at')
            ->whereNull('addresses.deleted_at')
            ->whereNull('childs.deleted_at')
            ->get();

【问题讨论】:

    标签: mysql laravel join select


    【解决方案1】:

    你应该能够做到;

    SELECT `assignments`.`id` AS `assignment_id`,
           `assignments`.`persons` AS `assignment_persons`,
           `assignments`.`start_date` AS `assignment_start_date`,
           `assignments`.`end_date` AS `assignment_end_date`,
           `addresses`.`id` AS `address_id`,
           `addresses`.`first_name` AS `address_first_name`,
           `addresses`.`last_name` AS `address_last_name`,
           `addresses`.`company` AS `address_company`,
           `childs`.`id` AS `child_id`,
           `childs`.`address_id` AS `child_address_id`,
           `childs`.`sibling_id` AS `child_sibling_id`,
           `childs`.`height` AS `child_height`,
           `childs`.`weight` AS `child_weight`
    FROM `assignments`
    INNER JOIN `addresses` ON `assignments`.`address_id` = `addresses`.`id`
    INNER JOIN `childs` ON `assignments`.`id` = `childs`.`assignment_id` AND 
                           `childs`.`address_id` = `addresses`.`id`
    WHERE `assignments`.`deleted_at` IS NULL
      AND `addresses`.`deleted_at` IS NULL
      AND `childs`.`deleted_at` IS NULL
    

    而在 Laravel 中,这可以通过做来实现;

     $assignment_data =  DB::table('assignments')
            ->join('addresses', 'assignments.address_id',  '=', 'addresses.id')
            ->join('childs', function($q) { 
                   $q->on('assignments.id',  '=', 'childs.assignment_id')
                     ->where('childs.address_id', '=', 'addresses.id');
              })
            ->select(
                'assignments.id as assignment_id',
                'assignments.persons as assignment_persons',
                'assignments.start_date as assignment_start_date',
                'assignments.end_date as assignment_end_date',
                'addresses.id as address_id',
                'addresses.first_name as address_first_name',
                'addresses.last_name as address_last_name',
                'addresses.company as address_company',
                'childs.id as child_id',
                'childs.address_id as child_address_id',
                'childs.sibling_id as child_sibling_id',
                'childs.height as child_height',
                'childs.weight as child_weight'
    
            )
            ->whereNull('assignments.deleted_at')
            ->whereNull('addresses.deleted_at')
            ->whereNull('childs.deleted_at')
            ->get();
    

    但是您应该注意,通过执行 INNER JOINS,您只会在每个表中有行的情况下获得结果。您最好还是使用 LEFT JOINS,这取决于您的数据是如何被需要的。

    【讨论】:

    • 谢谢伙计,工作。除非你有一个错字。需要是childs`.`address_id` = `addresses`.`id。你忘记了两个重力。但是,如何选择孩子的fist_namelast_name
    • 您将孩子的名字和姓氏存储在哪里?在孩子的桌子上?
    • 不,地址表。这就是为什么我需要在 childs 表上加入地址表
    • 进行分配时,看起来好像添加了一个或多个地址,并且对于每个地址,该地址有多个子代?在childs表上记录孩子的名字不是更容易吗?
    • 是的,我也想通了......而且一份作业总是可以只有一个(发票)地址
    猜你喜欢
    • 2018-11-10
    • 2019-10-26
    • 1970-01-01
    • 2012-10-13
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多