首页 > 解决方案 > 如何访问连接表的列

问题描述

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

标签: phpyii2

解决方案


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

乍一看或任何人都会认为您正在尝试调用一个关系然后访问它的字段,如果是这样的话,它应该$job->career_company->title 没有$符号。但是您没有在此处访问您正在使用的关系innerJoincareer_company尝试通过$job->$career_company它访问它是错误的。

让你的想法

你有2个选择

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

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

  1. 定义关系和使用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我使用该列的别名,因为您可能titleCareer模型/表中具有与名称相同的列。

  • 然后通过将字段列为更新规则safe

public function rules()
{
    return [
        ...//other rules
        [['career_title'], 'safe'],
    ];
}

现在转到您正在创建 XML 的视图,并将代码更改为

<?php foreach ($model as $job) { ?>
    <JobadType>
        <?= $job->career_title?>
    </JobadType>
<?php } ?>

推荐阅读