php - 如何访问连接表的列
问题描述
我有一个查询应该返回一个与另一个表连接的表的结果,我还有一个循环遍历所述结果并将数据写入 XML。我在访问主表列时没有问题,但我找不到访问连接表列的方法。
我尝试像访问它$job->$career_company->title
而不是访问它$job->title
,因为这是我找到的唯一答案,但它仍然不起作用。
我的查询
$model = Career::find()
->joinWith('contact0')
->where(['not', ['responsible_person' => '']])
->where(['>=', 'valid_until', date('Y-m-d', strtotime('-1 week', strtotime(date('Y-m-d'))))])
->innerJoin('career_company', 'career_company_id = career_company.id')
->all();
使用数据
<?php foreach ($model as $job) { ?>
<JobadType>
<?= $job->$career_company->title ?>
</JobadType>
<?php } ?>
给我的错误是:PHP Notice – yii\base\ErrorException 未定义变量:career_company
解决方案
您应该注意的第一件事是<?= $job->$career_company->title ?>
.
乍一看或任何人都会认为您正在尝试调用一个关系然后访问它的字段,如果是这样的话,它应该$job->career_company->title
没有$
符号。但是您没有在此处访问您正在使用的关系innerJoin
并career_company
尝试通过$job->$career_company
它访问它是错误的。
让你的想法
你有2个选择
- 使用
innerJoin()
手动加入表- 手动加入表。
- 指定连接表中的列。
Career
使用该名称在模型中定义一个公共属性。safe
在模型的规则中添加字段Career
。
如果您使用->asArray()->all()
查询将结果作为数组而不是模型实例返回,则上面的最后 2 个选项是可选的。
- 定义关系和使用
innerJoinWIth
career_company
为say定义一个关系,careerCompany
。- 用于
innerJoinWith
通过内部连接加入关系。 - 按照您在上面尝试的方式使用它
$job->careerCompany->title
。
查询构建
由于我们没有提供任何模型,所以我会选择您使用的第一个选项,即innerJoin
您需要将列添加到
->select([column_1,column2])
关系表字段的子句中,要么用于*
从两个表中选择所有列,要么在数组中一一提及它们。你在 where 子句中做的太多了
date('Y-m-d', strtotime('-1 week', strtotime(date('Y-m-d'))))
,应该是date('Y-m-d',strtotime('NOW -1 week'))
。完成上述两项后,您的查询应如下所示
$model = Career::find()
->alias('c')
->select(['c.*', 'cc.title as career_title'])
->joinWith('contact0')
->where(['not', ['c.responsible_person' => '']])
->where(
['>=', 'c.valid_until', date('Y-m-d', strtotime('NOW -1 week'))]
)
->innerJoin('career_company cc', 'c.career_company_id = cc.id')
->all();
现在您需要在模型内定义字段,
Career
因此进入您的模型并定义一个属性,public $career_title
我使用该列的别名,因为您可能title
在Career
模型/表中具有与名称相同的列。然后通过将字段列为更新规则
safe
public function rules()
{
return [
...//other rules
[['career_title'], 'safe'],
];
}
现在转到您正在创建 XML 的视图,并将代码更改为
<?php foreach ($model as $job) { ?>
<JobadType>
<?= $job->career_title?>
</JobadType>
<?php } ?>
推荐阅读
- c# - 如何将 Byte[] 转换为 RSAParameters
- c++ - 在 arm64 docker 容器中运行 c++ 应用程序时出现错误“getsockopt level=1 optname=20 not yet supported”
- java - 使用java在android中将文本插入剪贴板
- reactjs - 反应useState数组不重置
- java - 如何防止第一帧在第二帧打开时被丢弃?
- svg - svg tags(id, class) 如何摆脱它们并制作可重用的组件
- vue.js - 错误:无法从 Azure DevOps 构建管道中的 index.js 解析“./src/components/uiListItem.vue”
- dask - Dask仪表板未显示
- api - 谷歌会见直接视频提要 api
- sql - postgres查询效率问题及变量声明