【问题标题】:Yii2: How to do a inner join of three tables?Yii2:如何做三张表的内连接?
【发布时间】:2019-04-16 15:45:27
【问题描述】:

我有一个多对多的关系,所以我有三个表(administratorsofficesintermediate table): p>

我需要对三个表进行非常简单的innerjoin,以使用Active Record 显示lastnames 及其offices。我试过了,但我做不到。

这是我尝试过的:

$admins = Admins::find()
    ->joinWith(Oficinas::tableName())
    ->all();

echo '<pre>';
print_r($admins);
echo '</pre>';
die();

我还想知道如何显示 SQL 查询,以便它可以帮助我找到解决方案。

【问题讨论】:

  • 你尝试了什么,添加你的查询
  • joinWith 用于您需要指定关系名称而不是表名称的关系
  • use text, not images/links, for text--including tables & ERDs. 仅将图像用于无法表达为文本或扩充文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。使您的帖子自成一体。请在代码问题中给出minimal reproducible example--剪切 & 粘贴 & 可运行的代码 & 所需的输出 & 明确的规范 & 解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)

标签: join activerecord yii2


【解决方案1】:

您需要为joinWith() 指定关系名称而不是表名称。由于没有关于关系名称的任何信息,我将根据您的要求使用简单的innerJoin 使用表名来显示管理员的姓氏和办公室名称。

Admins::find()
->alias('a')
->select('a.lastnameadm, o.nombreofi')
->innerJoin('admin_oficinas ao','ao.idadm = a.idadm')
->innerJoin('oficinas o','o.idofi = ao.idofi')
->all();

【讨论】:

    【解决方案2】:

    试试这个:

    TABLE_NAME_1::find()
       ->join('inner join', 
                   'table_name_2',
                   'table_name_2.column = table_name_1.column'
               ); 
       ->join('inner join', 
                   'table_name_3',
                   'table_name_3.column = table_name_2.column'
               )->all();
    

    但是如果你也可以像下面的例子一样使用 Via:

    public function getClassschedule()
    {
        return $this->hasOne(TABLE_NAME_2::className(), ['table_name_1.column' => 'table_name_2.column'])
            ->via('tableName3');
    }
    

    当排除时,应该像前面的例子一样获得结果。所以没有必要重复关系。完整的文档可以在这里看到: https://www.yiiframework.com/doc/guide/2.0/en/db-active-record

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 2011-11-10
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多