我有一个查询,该查询应该从与另一个表连接的表中返回结果,还有一个循环,循环遍历所述结果并将数据写入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公告– yii \ base \ ErrorException 未定义的变量:career_company
答案 0 :(得分:1)
您应该注意的第一件事是<?= $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
说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 } ?>