Join yii2模型与关系的发现

Join yii2模型与关系的发现,join,model-view-controller,yii2,relational-database,Join,Model View Controller,Yii2,Relational Database,我有以下疑问 $model_company = Members_companies::find() ->select(['members_companies.id', 'companies.name']) ->leftJoin('companies', 'members_companies.company = companies.id ') ->where(['members_companies.m

我有以下疑问

    $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();
查询结果显示没有错误。此外,结果还显示了正确的记录。但是没有
公司。name
列显示可用结果。 如果我在
MYSQL Workbench
PHPMyAdmin
中执行相同的查询,查询还会显示带有值的
companys.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\u companys
作为对象获取结果。所以它不包括公司名称,若您想要公司名称,最简单的方法是将查询结果作为数组而不是如下所示的对象

$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();
根据,应将列到列的匹配条件指定为字符串

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

$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\u Companys模型中添加新的公共属性$cname。然后 为companys.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();

源于

以及如何访问
公司。名称
?在视图中,但我也跟踪调试过程,并在视图结束前立即看到结果。这是因为它在视图中的结果数组中是simpy“name”,用作和所需的列名,如“companys.name as companys\u name”。我没有问
在哪里
,我问了
如何
。@Yupik问你的是如何访问这个专栏。类似于$model_company[0]['id']或类似的东西。我只是(错误地)在我的评论中指出,您在查询中使用了asArray()。我已经这样做了,正如您和Vladimir建议的那样。结果是数组(大小=2)'id'=>string'2'(长度=1)'name'=>null->select('members_companys.id,companys.name')尝试此操作同时更改select,结果保持不变0=>array(大小=2)'id'=>string'2'(长度=1)'name'=>null 1=>array(大小=2)'id'=>string'5'(长度=1)'name'=>null两个表是否都包含列名?->选择('members\u companys.id,companys.name as company\u name')尝试此操作需要包括->asArray()。这通常在第一句话中被遗漏了!谢谢!是的,如果你想将结果集设置为一个数组,就像你的案例一样,更新我的答案我删除了我的答案,以防止重复发布并相信你的答案!感谢你和弗拉基米尔的持续努力!使用原始表名时,最好在查询中用
{{%}
和列
[[]]
包装
表名
,这样,如果配置中的表使用了别名,则应将其附加到这些表中。只需更新您的答案。