Я беру Java-приложение и перемещаю его в php. Я имею опыт работы в Java и использовал Hibernate для решения ORM.
У меня есть существующая модель данных для использования, и я внедряю ее в Yii.
Мне нужна помощь.
У меня есть отношения многие ко многим.
диета -> диетическая мука <- еда -> еда еда <- еда
Соединительные столы:
dietmeal
mealfood
Диета может иметь много приемов пищи & питание может принадлежать многим диетам.
У еды может быть много продуктов & продукты могут принадлежать многим приемам пищи.
В таблицах Junction есть поля, которые мне нужно использовать в моем представлении, а также обновить. Например: количество, unit_of_measure.
Как я могу получить эти поля сразу, загружая обе основные таблицы соединительных таблиц?
В Java Hibernate это довольно просто.
SQL, который я хочу сгенерировать с помощью yii, выглядит следующим образом, также 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;
Рекомендации
Других решений пока нет …