我正在使用Java应用程序并将其移至php。我在Java方面经验丰富,并且将休眠用于ORM解决方案。
我有一个要使用的现有数据模型,并正在Yii中实现它。
我需要帮助。
我有多对多的关系。
饮食->饮食餐食
联结表是:
饮食
餐食
饮食可以有很多饮食,而饮食可以属于许多饮食。
一顿饭可以有很多食物,而食物可以属于许多顿饭。
Junction表具有我需要在视图中使用并更新的字段。例如:数量,unit_of_measure。
我如何一次获得所有这些字段,从而加载两个联结表主表?
在Java Hibernate中,这非常容易。
我想用yii生成的sql如下,也让yii填充了整个对象图,
填充饮食->饮食餐食
这是休眠输出的示例。它执行此sql并填充对象图。
select distinct diet.*[columns] ,
dietmeal.*[columns],
meals.*[columns],
mealfood.*[columns],
foods.*[columns],
childfoods.*
from test_schema.diet diet
left outer join test_schema.diet_meal dietmeal on diet.id=dietmeal.diet_id
left outer join test_schema.meal meal on dietmeal.meal_id=meals.id
left outer join test_schema.meal_food mealfood on meals.id=mealfood3_.meal_id
left outer join test_schema.food foods on mealfood.food_id=foods.id
left outer join test_schema.food childfoods on foods.id=childfoods.parent_id
left outer join test_schema.schedulable schedulabl on diet.schedulable_id=schedulabl6_.ID
where diet.id=19
order by dietmeal.time asc,
meals.name desc,
foods.calories desc
我怎样才能在yii中做到这一点?如何设置它,这样我就可以执行这样的连接并填充整个对象图。
如何在Yiii 1. *和2. *中进行操作
最佳答案
您需要回到Yii及其ActiveRecord数据建模的基础。
首先,您将需要为每个数据库表定义模型类。每个类都有一个关系函数,您可以重写该关系函数以指定表之间的关系。
class Diet extends CActiveRecord
{
// ...
public function relations()
{
return array(
// Take note of the relationship tag. We will see it later
'meals'=>array(self::HAS_MANY, 'Dietmeal', 'diet_id'),
);
}
}
注意,您还需要在Dietmeal类中定义关系。
class Dietmeal extends CActiveRecord
{
// ...
public function relations()
{
return array(
'diet'=>array(self::HAS_MANY, 'Diet', 'diet_id'),
);
}
}
然后,您可以组织结果
$dietModel = Diet::model()->findByPk(10);
// the 'meal' attribute is injected from the relationship name.
$dietMeals = $dietModel->meals;
参考文献
http://www.yiiframework.com/doc/guide/1.1/en/database.arr
关于php - Yii多对多,连接表对象图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28078784/