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()。这通常在第一句话中被遗漏了!谢谢!是的,如果你想将结果集设置为一个数组,就像你的案例一样,更新我的答案我删除了我的答案,以防止重复发布并相信你的答案!感谢你和弗拉基米尔的持续努力!使用原始表名时,最好在查询中用{{%}
和列[[]]
包装表名
,这样,如果配置中的表使用了别名,则应将其附加到这些表中。只需更新您的答案。