如何访问联接表的列

时间:2019-07-24 12:43:40

标签: php yii2

我有一个查询,该查询应该从与另一个表连接的表中返回结果,还有一个循环,循环遍历所述结果并将数据写入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

1 个答案:

答案 0 :(得分:1)

您应该注意的第一件事是<?= $job->$career_company->title ?>

乍一看或任何人都会想到的是,您正在尝试调用一个关系然后访问它的字段,如果是这样的话,它应该是$job->career_company->title $ 符号。但是您在这里没有访问关系,而是在innerJoin上使用career_company并尝试通过$job->$career_company访问关系。

下定决心

您有2个选项

  1. 使用innerJoin()手动加入表格
    • 手动加入表格。
    • 指定联接表中的列。
    • Career模型中用该名称定义一个公共属性。
    • safe模型的Career规则中添加字段。

如果您在查询中使用->asArray()->all()将结果作为数组而不是模型实例返回,则上面的最后2个选项是可选的。

  1. 定义关系并使用innerJoinWIth
    • career_companycareerCompany定义一个关系。
    • 使用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 } ?>