yii2 模型查找关系

yii2 model find with relation

我有以下查询

    $model_company = Members_companies::find()
            ->select(['members_companies.id', 'companies.name'])
            ->leftJoin('companies', 'members_companies.company = companies.id ')
            ->where(['members_companies.member' => $member])
            ->orderBy(['companies.name' => SORT_ASC])
            ->all();

查询结果没有错误。此外,结果还显示了正确的记录。但是没有 companies.name 列有可用的结果。 如果我在 MYSQL WorkbenchPHPMyAdmin 中执行相同的查询,查询还会显示带有值的 companies.name 列。

这个查询是相同的结果:

$model_company = Members_companies::find()
        ->select(['members_companies.id', 'companies.name'])
        ->leftJoin('companies', ['members_companies.company' => 'companies.id'])
        ->where(['members_companies.member' => $member])
        ->orderBy(['companies.name' => SORT_ASC])
        ->all();

您得到的结果是 Members_companies 作为对象。所以它不包括公司名称,如果你想要公司名称,最简单的方法是将查询结果作为数组而不是对象获取,如下所示

$model_company = Members_companies::find()
        ->select('members_companies.id,companies.name')
        ->leftJoin('companies', 'members_companies.company = companies.id ')
        ->where(['members_companies.member' => $member])
        ->orderBy(['companies.name' => SORT_ASC])
        ->asArray();
        ->all();

根据docs for on condition,您应该将列到列的匹配条件指定为字符串。

因此,如果我们将您的条件更新为字符串而不是数组,它应该可以工作。更新了以下代码:

$model_company = Members_companies::find()
        ->select(new yii\db\Expression('{{%members_companies}}.[[id]], {{%companies}}.[[name]]'])
        ->leftJoin('{{%companies}} c', '{{%members_companies}}.[[company]]=c.[[id]]')
        ->where(['{{%members_companies}}.[[member]]' => $member])
        ->orderBy(['c.[[name]]' => SORT_ASC])
        ->asArray()
        ->all();

在 Members_companies 模型中添加一个新的 public 属性 $cname。接着 像这样为 companies.name 列添加别名:

$model_company = Members_companies::find()
        ->select('members_companies.id, companies.name as cname')
        ->leftJoin('companies', ['members_companies.company' => 'companies.id'])
        ->where(['members_companies.member' => $member])
        ->orderBy(['companies.name' => SORT_ASC])
        ->all();

您会看到包含公司名称的 cname 属性。

如果你和公司模型有关系,你可以这样写查询

$model_company = Members_companies::find()
        ->select('members_companies.id, companies.name as cname')
        ->joinWith(['companies'])
        ->where(['members_companies.member' => $member])
        ->orderBy(['companies.name' => SORT_ASC])
        ->all();

来源自https://forum.yiiframework.com/t/how-to-include-relation-of-relation-in-find-model/84982/2