如何获取yii2中引用其他表的表?

时间:2015-10-22 08:21:24

标签: php yii2

我有多个表连接在一起,我需要一个查询并获得所有引用!
可能在yii2 ??
让他们在层次结构数组?
怎么样 ???

  

是否可以不使用join ???

感谢您的帮助!!!!

sample db

3 个答案:

答案 0 :(得分:1)

我只想提出一个小建议:

在维护表中的关系时,如果使用Gii生成代码,那么将为您生成连接。然后,您可以轻松访问任何表格的任何列。

但我认为UNION可能不是JOIN的替代品。

答案 1 :(得分:1)

如果使用Gii为每个表创建模型类并选择在生成的模型中创建关系,则可以执行以下操作:

1)在您的国家/地区模型中,只需更改声明与机场关系的方法,如下所示:

public function getAirports() {
    return $this->hasMany(Airports::className(), ['country_id' => 'id'])->with('airlines');
}

2)当你对这些国家进行查询时,你需要让相关的机场,航空公司和航班预订这样做:

$countries = Countries::find()
    ->where('something = something_else')
    ->with('airports')
    ->with('flightbooked')
    ->all();

通过这种方式,您可以使用比使用延迟加载更少的查询来填充所有相关模型。

答案 2 :(得分:0)

也许你可以使用 union all 。使用此运算符,您可以将多个查询的结果集连接在一起,从而保留每个查询的所有行。请注意,UNION运算符(没有ALL关键字)将消除结果集中存在的任何“重复”行。 UNION ALL运算符保留每个查询中的所有行(并且可能性能更好,因为它没有执行重复检查和删除操作的开销)。

每列的列数和数据类型必须在每个查询中匹配。如果其中一个查询的列数多于另一个查询,我们有时会在另一个查询中包含虚拟表达式,以使列和数据类型“匹配”。通常,在每个返回文字的查询的SELECT列表中包含一个表达式(一个额外的列)是有帮助的,以显示哪些查询是该行的“源”。

SELECT 'col1' AS source, col23, col343, col33, d FROM table1 WHERE ...
UNION ALL
SELECT 'col2', t2.fee, table2.fi, table2.fo, 'fum' FROM table2 JOIN table3 ON ...
UNION ALL
SELECT 'col3', '1', '2', buckle, my_shoe FROM table4

您可以在一组括号中包装这样的查询,并将其用作内联视图(或MySQL语言中的“派生表”),以便您可以对所有行执行聚合操作。 e.g:

select one.a
     , SUM(one.b)

  FROM (
         SELECT 'q1' AS source, a, b, c, d FROM t1
          UNION ALL
         SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
       ) one
 GROUP BY one.a
 ORDER BY one.a

但我认为加入桌子更合适。希望能帮到你