Yii多对多,联结表对象图

时间:2015-01-21 23:26:24

标签: php mysql join yii junction

我正在使用Java应用程序并将其移至php。我在java方面很有经验,并使用hibernate作为ORM解决方案。 我有一个现有的数据模型要使用,并在Yii中实现它。

我需要帮助。

我有多对多的关系。

饮食 - >饭菜< - 饭 - >膳食食品< - 食品

联结表是: dietmeal mealfood

饮食可以有很多餐和饭菜可以属于很多饮食。 一顿饭可以有很多食物&食物可以属于多餐。

Junction表包含我需要在视图中使用的字段以及更新。例如:quantity,unit_of_measure。 如何一次性获取这些字段,从而加载连接表主表?

在Java Hibernate中,它非常简单。

我想用yii生成的sql如下,也有yii填充整个对象图, 填充饮食 - >饭菜< - 饭 - >膳食食品< - 食品

以下是Hibernate输出的示例。它执行这个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. *

1 个答案:

答案 0 :(得分:0)

您需要回到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;

参考