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 Workbench
或 PHPMyAdmin
中执行相同的查询,查询还会显示带有值的 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
我有以下查询
$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 Workbench
或 PHPMyAdmin
中执行相同的查询,查询还会显示带有值的 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