首页 > 解决方案 > 3 不同的表有相同的外键,如何选择

问题描述

假设我有 3 个不同的表,它们具有相同的外键,如下所示:-

  1. 表一product_unit

    | id  |  product_id  |  weight |  status_id  |
    |:----|--------------|---------|------------:|
    |  1  |      4       |   300   |      1      |
    |  2  |      5       |   120   |      2      |
    
  2. 表二product_package

    | id  |  product_id  |  weight |  status_id  |
    |:----|--------------|---------|------------:|
    |  1  |      4       |   1.2   |      1      |
    |  2  |      5       |   480   |      1      |
    
  3. 表三product_carton

    | id  |  product_id  |  weight |  status_id  |
    |:----|--------------|---------|------------:|
    |  1  |      4       |  10.2   |      1      |
    |  2  |      5       |   4.8   |      2      |
    

其中表产品状态表如下图:-

一个。产品

    | id  |     name      |
    |:----|--------------:|
    |  4  |  Choco Cake   |
    |  5  | Hazelnut Bun  |

湾。状态

    | id  |  description  |
    |:----|--------------:|
    |  1  |   Available   |
    |  2  |  Unavailable  |

如何通过1 个查询从这 3 个表(product_unit、product_package 和 product_carton)中获取所有状态

到目前为止,我能够做到这一点: -

$product_info = Product::find()
->select([
      'product.name AS productName',
      'product_unit.weight AS weightUnit',
      'product_package.weight AS weightPackage',
      'product_carton.weight AS weightCarton', 
      'status.description AS statusDesc'])
->leftJoin('product_unit', 'product.id = product_unit.product_id')
->leftJoin('product_package', 'product.id = product_package.product_id')
->leftJoin('product_carton', 'product.id = product_carton.product_id')
->leftJoin('status', 'status.id = product_unit.status_id')
->asArray()
->all();

通过上面的查询,我只能从product_unit 表中获取'statusDesc',因为我使用 product_unit 表的 'leftJoin()' 状态表

如何加入其他2 个表(product_package 和 product_carton)并从它们那里获取statusDesc?有什么办法可以用1 Query做到这一点?

标签: mysqlleft-joinyii2-model

解决方案


$product_info = Product::find()
->select([
      'product.name AS productName',
      'product_unit.weight AS weightUnit',
      'product_package.weight AS weightPackage',
      'product_carton.weight AS weightCarton', 
      's1.description AS status_unit_Desc'])
      's2.description AS status_package_Desc'])
      's3.description AS status_carton_Desc'])
->leftJoin('product_unit', 'product.id = product_unit.product_id')
->leftJoin('product_package', 'product.id = product_package.product_id')
->leftJoin('product_carton', 'product.id = product_carton.product_id')
->leftJoin('status AS s1', 's1.id = product_unit.status_id')
->leftJoin('status AS s2', 's2.id = product_package.status_id')
->leftJoin('status AS s3', 's3.id = product_carton.status_id')
->asArray()
->all();

PS。也许innerJoin 会比leftJoin 更合适?


推荐阅读