我正在使用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/

10-13 08:17