yii2 join - > with()将右表数据记录到模型中

时间:2016-04-10 13:17:02

标签: mysql join activerecord yii2

关于项目关系的问题。这是我得到的: 我有一个主表{{%page}},其中一个模型页面正在使用它。它包含视图中未来动态使用的所有数据。 我还有一个表{{%file}},其中包含特定页面的文件。关键是“builder_id”列。我创建了模型之间的关系 - 在'Page'

 `public function getFiles() {
        return $this->hasMany(File::className(),['builder_id' => 'builder_id']);  

    }`

和'文件'

public function getPage() {
        return $this->hasOne(Page::className(), ['builder_id' => 'builder_id']);

    } 

目标:使用此方法获取Page模型时:

public static function getPageById ($builder_id = 1) {
        $model = Page::find()->where(['builder_id' => $builder_id])->one();

        if ($model === null) {
            throw new NotFoundHttpException("Error.");
        }

        return $model;
    } 

还要在模型中记录页面的文件,其中builder_id是相同的。为此我使用->with(),这使得页面方法如下:

public static function getPageById ($builder_id = 1) {
        $model = Page::find()
                ->with('file')
                ->where(['builder_id' => $builder_id]);

        if ($model === null) {
            throw new NotFoundHttpException("Error.");
        }

但在模型中,我既没有第一张表数据,也没有第二张。模型的Vardump给出了这个

object(yii\db\ActiveQuery)#64 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> NULL ["groupBy"]=> NULL ["join"]=> NULL ["having"]=> NULL ["union"]=> NULL ["params"]=> array(0) { } ["_events":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } ["where"]=> array(1) { ["builder_id"]=> string(1) "2" } ["limit"]=> NULL ["offset"]=> NULL ["orderBy"]=> NULL ["indexBy"]=> NULL ["modelClass"]=> string(15) "app\models\Page" ["with"]=> array(1) { [0]=> string(5) "files" } ["asArray"]=> NULL ["multiple"]=> NULL ["primaryModel"]=> NULL ["link"]=> NULL ["via"]=> NULL ["inverseOf"]=> NULL }  

我做错了什么?

1 个答案:

答案 0 :(得分:0)

请务必在查询后致电one()all()

public static function getPageById ($builder_id = 1) {
    $model = Page::find()
            ->with('files') // here is you typo. You defined relationship with files and accessing it through file.
            ->where(['builder_id' => $builder_id])
            ->one(); // this line will return result.

    if ($model === null) {
        throw new NotFoundHttpException("Error.");
    }

在您的情况下,您没有对ActiveQuery对象执行任何操作。 您需要在查询对象上调用all()或one()来获取结果