Possible to Fix a Foreign Key in Yii without havin

2019-07-30 04:40发布

I'm using phpMyAdmin for my database GUI and it's connecting to Yii Framework on my website.

I wish for my products table for instance, to have a foreign key department_id which is a reference to the id field of my departments table. Unfortunately, I don't currently have the facility to set the foreign key up properly in phpMyAdmin, so department_id is just an indexed field. I cannot change the configuration of phpMyAdmin at the moment so it's stuck like it is without a foreign key and relationship facility.

Is there a way to modify the Models of these tables in Yii so they link? I know there is a relations function inside the Model Class file that holds this information:

return array('department_id' => array(self::BELONGS_TO, 'Departments', 'id'),

Could I not just add something similar to the above? Is there more legwork? Is it now fixed (as in static, not corrected) because of phpMyAdmin?

Cheers

1条回答
Bombasti
2楼-- · 2019-07-30 05:20

If I'm not mistaken, you don't need to have mySql enforcing foreign key relationships for them to still work in Yii. Setting up FK constraints in mySql ensures proper database integrity, but I don't think Yii actually uses that at runtime.

When initially running yiic (of Gii) to build the project I think it looks at the DB to build the right relations in the Model, but it doesn't use them after that.

Yii then uses this knowledge (from yiic) of the table relationships to make your life easier by providing shortcut methods to access relational data, and to ensure you don't violate mySql constraints and get ugly SQL errors, etc. But you can still use Yii relation logic without the underlying SQL constraints. The only problem will be that if Yii messes up and assigns a non-existing FK or something, your database will not catch this error (your data integrity will be more error prone).

To link your products to departments, just make sure you have a department_id field in the Product (which it sounds like you do). Then add a relation rule like so to Product:

'department' => array(self::BELONGS_TO, 'Department', 'department_id'),

And in your Department model:

'products' => array(self::HAS_MANY, 'Product', 'department_id'),

Now you should be able to use the relation like normal:

$myProductModel->department; // returns the model of the Department referenced
$myDepartmentModel->products; // returns the models of all Products in the department

Good luck, and let me know if I am way off base and it doesn't work for you!

查看更多
登录 后发表回答