Yii2 多对多模型关系
Yii2 many-to-many model relation
我在两个 yii2 模型之间实现了多对多关系:
slider, images, sliders_images 其中 sliders_images 是连接点 table。
每个模型都扩展了一个由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']);
}
...
滑块Images.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() 来填充结点 table 以创建滑块时一切正常,但是当我尝试从滑块 ActiveRecord 对象获取图像时出现问题 (Yii2 documentation):
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 变量,则该变量为空且不包含相关图像。
我如何设置模型以在关系中获得正确的访问权限?
编辑:
当我尝试访问 slidersImage 以获取 juncyion 的行时 table:$slider->sliderImage
工作正常,错过了图像行的访问。
滑块table
id | nome | descrizione | active
-------------------------------------------
28 | adfjkhbfvòja | JAFNHÒDF | 1
sliders_imagestable
slider_id | image_id | display_order|
--------------------------------------
28 | 16 | 3 |
--------------------------------------
28 | 17 | 5 |
图片 table
id | date | url |
------------------------------------
16 | 2016-06-21 16:21:04 | img/url |
------------------------------------
17 | 2016-06-21 16:22:37 | img/url |
编辑2:
来自调试器的数据库序列:
1 11:27:02.666 0.7 ms 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 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 ms SELECT SELECT * FROM `admin` WHERE (`id`=2) AND (`status`=10)
/var/www/html/yii_advance/backend/models/Admin.php (65)
[+] Explain
--------------------------------------------------------------------------
4 11:27:02.667 0.5 ms SELECT SELECT
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 IS NULL AND rc.constraint_catalog IS NULL)
) AND
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)
[+] Explain
--------------------------------------------------------------------------
5 11:27:02.669 0.5 ms SELECT SELECT
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 IS NULL AND rc.constraint_catalog IS NULL)
) AND
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)
[+] Explain
--------------------------------------------------------------------------
6 11:27:02.669 0.4 ms SELECT SELECT * FROM `slider` 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)
这个 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
...
我在两个 yii2 模型之间实现了多对多关系:
slider, images, sliders_images 其中 sliders_images 是连接点 table。
每个模型都扩展了一个由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']);
}
...
滑块Images.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() 来填充结点 table 以创建滑块时一切正常,但是当我尝试从滑块 ActiveRecord 对象获取图像时出现问题 (Yii2 documentation):
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 变量,则该变量为空且不包含相关图像。 我如何设置模型以在关系中获得正确的访问权限?
编辑:
当我尝试访问 slidersImage 以获取 juncyion 的行时 table:$slider->sliderImage
工作正常,错过了图像行的访问。
滑块table
id | nome | descrizione | active ------------------------------------------- 28 | adfjkhbfvòja | JAFNHÒDF | 1
sliders_imagestable
slider_id | image_id | display_order| -------------------------------------- 28 | 16 | 3 | -------------------------------------- 28 | 17 | 5 |
图片 table
id | date | url | ------------------------------------ 16 | 2016-06-21 16:21:04 | img/url | ------------------------------------ 17 | 2016-06-21 16:22:37 | img/url |
编辑2:
来自调试器的数据库序列:
1 11:27:02.666 0.7 ms 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 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 ms SELECT SELECT * FROM `admin` WHERE (`id`=2) AND (`status`=10) /var/www/html/yii_advance/backend/models/Admin.php (65) [+] Explain -------------------------------------------------------------------------- 4 11:27:02.667 0.5 ms SELECT SELECT 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 IS NULL AND rc.constraint_catalog IS NULL) ) AND 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) [+] Explain -------------------------------------------------------------------------- 5 11:27:02.669 0.5 ms SELECT SELECT 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 IS NULL AND rc.constraint_catalog IS NULL) ) AND 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) [+] Explain -------------------------------------------------------------------------- 6 11:27:02.669 0.4 ms SELECT SELECT * FROM `slider` 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)
这个 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
...