1

我正在使用 Java 应用程序并将其移至 php。我在 Java 方面经验丰富,并在 ORM 解决方案中使用过 hibernate。我有一个现有的数据模型可以使用,并且正在 Yii 中实现它。

我需要帮助。

我有多对多的关系。

饮食 -> 饮食餐 <- 膳食 -> 餐食 <- 食物

连接表是:dietmeal mealfood

饮食可以有很多餐,餐可以属于多种饮食。一餐可以有很多食物,食物可以属于很多餐。

连接表具有我需要在视图中使用并更新的字段。例如:数量,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 中做到这一点?如何设置它,这样我就可以执行这样的连接并填充整个对象图。

如何在 Yii 1.* 和 2.* 中做

4

1 回答 1

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;

参考

于 2015-01-23T08:17:45.950 回答