1

私は 2 つの yii2 モデル間で多対多の関係を実装しました: スライダー、イメージ、sliders_images ここで、sliders_images はジャンクション テーブルです。各モデルは Gii によって生成された基本モデルを拡張するため、必要なときに個人的な方法を失わずに基本モデルを上書きできます。
Slider.php

...
public function getImages(){
    return $this->hasMany(Images::className(), ['id' => 'image_id'])
        ->viaTable('sliders_images', ['slider_id' => 'id']);
}
...

Images.php

...
public function getSlider(){
     return $this->hasMany(Slider::className(), ['slider_id' => 'id'])
        ->viaTable('sliders_images', ['image_id' => 'id']);
}
...

SlidersImages.php

...
/**
 * @return \yii\db\ActiveQuery
 */
public function getImage()
{
    return $this->hasOne(Images::className(), ['id' => 'image_id']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getSlider()
{
    return $this->hasOne(Slider::className(), ['id' => 'slider_id']);
}
...

関数 link() を使用して、スライダーの作成時にジャンクション テーブルにデータを入力すると、すべて正常に動作しますが、スライダーの ActiveRecord オブジェクトから画像を取得しようとすると問題が発生します ( Yii2 ドキュメント)。

public function actionView($id)
{
    $slider = $this->findModel($id);
    return $this->render('view', [
        'model' => $slider,
        'images' => $slider->images
    ]);
}

protected function findModel($id)
{
    if (($model = Slider::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

ビューで $images 変数をデバッグすると、これは null になり、関連する画像が含まれません。リレーションで適切なアクセス権を取得するためのモデルを設定するにはどうすればよいですか?

編集:
スライダー画像にアクセス してjuncyionテーブルの行を取得しようとすると:正常に$slider->sliderImage動作し、画像行へのアクセスを逃します。

スライダーテーブル

ID | 名 | 説明 | アクティブ
-------------------------------------------
28 | adfjkhbfvoja | JAFNHÒDF | ヤフノフ | 1


sliders_images テーブル

スライダー ID | image_id | 表示順序|
--------------------------------------
28 | 16 | 3 |
--------------------------------------
28 | 17 | 5 |


画像テーブル

ID | 日付 | URL |
------------------------------------
16 | 2016-06-21 16:21:04 | 画像/URL |
------------------------------------
17 | 2016-06-21 16:22:37 | 画像/URL |

編集2:

デバッガーからのデータベース シーケンス:

    1 11:27:02.666 0.7 ms SHOW SHOW SHOW SHOW FULL COLUMNS FROM `admin`
    /var/www/html/yii_advance/backend/models/Admin.php (65)
-------------------------------------------------- -----------------------
    2 11:27:02.668 0.6 ms SHOW SHOW SHOW FULL COLUMNS FROM `slider`
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (173)
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (79)
-------------------------------------------------- ------------------------
    3 11:27:02.665 0.6 ミリ秒 SELECT SELECT * FROM `admin` WHERE (`id`=2) AND (`status`=10)
    /var/www/html/yii_advance/backend/models/Admin.php (65)
    [+] 説明する
-------------------------------------------------- ------------------------
    4 11:27:02.667 0.5ms 選択 選択
        kcu.constraint_name、
        kcu.column_name、
        kcu.referenced_table_name,
        kcu.referenced_column_name
    FROM information_schema.referential_constraints AS rc
    JOIN information_schema.key_column_usage AS kcu ON
        (
            kcu.constraint_catalog = rc.constraint_catalog OR
            (kcu.constraint_catalog は NULL であり、rc.constraint_catalog は NULL です)
        ) と
        kcu.constraint_schema = rc.constraint_schema AND
        kcu.constraint_name = rc.constraint_name
    WHERE rc.constraint_schema = database() AND kcu.table_schema = database()
    AND rc.table_name = 'admin' AND kcu.table_name = 'admin'
    /var/www/html/yii_advance/backend/models/Admin.php (65)
    [+] 説明する
-------------------------------------------------- ------------------------
    5 11:27:02.669 0.5ms 選択 選択
        kcu.constraint_name、
        kcu.column_name、
        kcu.referenced_table_name,
        kcu.referenced_column_name
    FROM information_schema.referential_constraints AS rc
    JOIN information_schema.key_column_usage AS kcu ON
        (
            kcu.constraint_catalog = rc.constraint_catalog OR
            (kcu.constraint_catalog は NULL であり、rc.constraint_catalog は NULL です)
        ) と
        kcu.constraint_schema = rc.constraint_schema AND
        kcu.constraint_name = rc.constraint_name
    WHERE rc.constraint_schema = database() AND kcu.table_schema = database()
    AND rc.table_name = 'slider' AND kcu.table_name = 'slider'
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (173)
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (79)
    [+] 説明する
-------------------------------------------------- ------------------------
    6 11:27:02.669 0.4 ミリ秒 SELECT SELECT * FROM `スライダー` WHERE `id`='28'
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (173)
    /var/www/html/yii_advance/common/modules/sliders/controllers/SliderController.php (79)

4

1 に答える 1

2

このpublic $images;プロパティはリレーションの名前と一致するため、名前を変更する必要がありますgetImages()

class Slider extends Sl
{
    const SCENARIO_CREATE = 'create';
    const SCENARIO_VIEW = 'view';
    const SCENARIO_UPDATE = 'update';

    public $images; // This should be renamed
    ...
于 2016-06-23T12:28:08.863 に答える