Вопрос по поводу MANY_MANY

Всем привет

Я не могу понять как мне решить проблему с MANY_MANY. Есть 3 таблицы

  1. tbl_recipe

	Field	Type	Collation	Attributes	Null	Default	Extra	Action

	id	int(11)			No	None	auto_increment	 	 	 	 	 	 	

	user_id	int(11)			No	None		 	 	 	 	 	 	

	name	varchar(255)	utf8_general_ci		No	None		 	 	 	 	 	 	 

	text	longtext	utf8_general_ci		No	None		 	 	 	 	 	 	 

	instruction	text	utf8_general_ci		No	None	

  1. tbl_ingredient

	Field	Type	Collation	Attributes	Null	Default	Extra	Action

	id	int(11)			No	None	auto_increment	 	 	 	 	 	 	

	name	varchar(100)	utf8_general_ci		No	None		 	 	 	 	 	 	 

	unit_id	int(11)			No	None	

  1. tbl_recipe_ingredient

	Field	Type	Collation	Attributes	Null	Default	Extra	Action

	recipe_id	int(11)			No	None		 	 	 	 	 	 	

	ingredient_id	int(11)			No	None		 	 	 	 	 	 	

	value	int(11)			No	None	

tbl_recipe хранит информацию о рецептах. tbl_ingredient Хранит информация об ингредиентах (яйца, мясо, …) tbl_recipe_ingredient служит для связи MANY_MANY этих двух таблиц. В этой таблице есть поле value которое отвечает за количество какого-то ингредиента. Т.е. например 200 грамм мяса, 3 яйца и т.д.

Проблема в том, что я не понимаю как получить value с помощью Active Record. Если написать так




    public function relations()

    {

        return array(

            'ingredients'=>array(self::MANY_MANY, 'Ingredient',

                'tbl_recipe_ingredient(recipe_id, ingredient_id)',

            ),

        );

    }



все работает, но нет доступа собственно к value.

А если так




    public function relations()

    {

        return array(

            'ingredients'=>array(self::MANY_MANY, 'Ingredient',

                'tbl_recipe_ingredient(recipe_id, ingredient_id)',

                'select' => 'tbl_ingredient.*, `tbl_recipe_ingredient`.`value`'

            ),

        );

    }



То появляется ошибка




Active record "Ingredient" is trying to select an invalid column "`tbl_recipe_ingredient`.`value`". Note, the column must exist in the table or be an expression with alias.



попробуй алиас ingredients_ingredients.value

или пиши что то типа




public function getIngredients()

{

return $this findAll(CDbCriteria прописывай join вручную)

}



Про алиас по-подробней, пожалуйста.

Над вторым вариантом думал, но хотелось бы конечно на Active Record задачу переложить

Вот еще вариант: http://www.yiiframework.com/forum/index.php?/topic/8011-many-many-how-to-select-some-fields-from-the-link-table/

а попробуй оставь все как есть только приватную value добавь в модель рецептов где связь

а про алиас мне кажется что он строится как имя_имя хотя имени таблицы как у Вас достаточно должно быть

Нет, так не работает. И с алиасами игрался по-разному, но не получается все равно.

Ну там в принципе все также как и gsd предложил. Странно что в таком мощном инструменте как Active Record не продумана эта возможность. Задача мне кажется не такая уж редкая.

Всем спасибо за помощь, пока сделаю через CDbCriteria, а потом может кто еще что подскажет или сам что придумаю, тогда отпишусь.

На самом деле действительно интересная задачка. Обязательно дома проведу эксперимент, есть одна мысль.

Самый простой вариант - разбить MANY_MANY на 2 отношения HAS_MANY.

А потом чуть более длинной связкой вытаскивать данные из промежуточной таблицы.




$recipe = Recipe::model()->findByPk($id);

foreach($recipe->recipe_ingredients as $recipe_ingredient) {

    echo $recipe_ingredient->value;

    echo $recipe_ingredient->ingredient->name;

}



Кстати, хороший вариант. Свой я так и не успел проверить еще :(