Как выбрать данный из промежуточной таблицы ?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Cepairda
Сообщения: 17
Зарегистрирован: 2017.06.27, 17:51

Как выбрать данный из промежуточной таблицы ?

Сообщение Cepairda »

Здравствуйте ! У меня в промежуточной таблицы кроме внешних ключей, есть еще одно поле. Так вот проблема в том, что после связывания, я этого поля не получаю. Но нужно.
В результате мне нужно получить после связывания Ингредиенты и к ним из промежуточной таблицы Количество каждого.

Картинка структуры БД в приложении.
Изображение
В контроллере

Код: Выделить всё

$recipe = Recipes::find()->where(['recipes.id' => $id])
            ->with(['ingredients']);
            ->asArray()
            ->one();
В моделе

Код: Выделить всё

public function getIngredients()
    {
        return $this->hasMany(Ingredient::className(), ['id' => 'ingredients_id'])
            ->viaTable('ingredients_recipes', ['recipes_id' => 'id']);
    }
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Как выбрать данный из промежуточной таблицы ?

Сообщение dmg »

Сделайте связь для этой таблицы.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Как выбрать данный из промежуточной таблицы ?

Сообщение proctoleha »

В модели Recipes у вас должна быть прописана связь

Код: Выделить всё

public function getIngredientsRecipes()
{
    return $this->hasMany(IngredientsRecipes::class, ['recipes_id' => 'id']);
}
И в контроллере

Код: Выделить всё

$recipe = Recipes::find()->where(['recipes.id' => $id])
            ->with('ingredients')
            ->with('ingredientsRecipes')
            ->asArray()
            ->one();
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Cepairda
Сообщения: 17
Зарегистрирован: 2017.06.27, 17:51

Re: Как выбрать данный из промежуточной таблицы ?

Сообщение Cepairda »

proctoleha писал(а): 2019.02.02, 04:17 В модели Recipes у вас должна быть прописана связь

Код: Выделить всё

public function getIngredientsRecipes()
{
    return $this->hasMany(IngredientsRecipes::class, ['recipes_id' => 'id']);
}
И в контроллере

Код: Выделить всё

$recipe = Recipes::find()->where(['recipes.id' => $id])
            ->with('ingredients')
            ->with('ingredientsRecipes')
            ->asArray()
            ->one();
Да знаю, что так можно...Но в таком случае оно выбирается в два разных массива. Мне нужно чтобы это было вместе выбрана, как через JOIN, такого типа.

Код: Выделить всё

$ingredients = Ingredient::find()
            ->select('ingredients.name, ingredients_recipes.quantity')
            ->leftJoin('ingredients_recipes', '`ingredients_recipes`.`ingredients_id` = `ingredients`.`id`')
            ->where(['ingredients_recipes.recipes_id' => $id])
            ->asArray()
            ->one();
        ;
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как выбрать данный из промежуточной таблицы ?

Сообщение andku83 »

Код: Выделить всё

class Recipe extends ArctiveRecord()
{
    public function IngredientRecipes()
    {
        return $this->hasMany(IngredientRecipe::class, ['recipe_id' => 'id']);
    }
}
class IngredientRecipe extends ArctiveRecord()
{
    public function getRecipes()
    {
        return $this->hasMany(Recipe::class, ['id' => 'recipe_id']);
    }
    public function getIngredients()
    {
        return $this->hasMany(Ingredient::class, ['id' => 'ingredients_id']);
    }
}
class Ingredient extends ArctiveRecord()
{
    public function IngredientRecipes()
    {
        return $this->hasMany(IngredientRecipe::class, ['ingredients_id' => 'id']);
    }
}

$recipe = Recipes::find()->where(['recipes.id' => $id])
            ->with('ingredientsRecipes.ingredients')
            ->asArray()
            ->one();

$ingredients = Ingredient::find()->alias('ingredient')
            ->select('ingredients.name, ingredientsRecipes.quantity')
            ->joinWith('ingredientsRecipes ingredientsRecipes', 'ingredientsRecipes.ingredients ingredients')
            ->where(['ingredientsRecipes.recipes_id' => $id])
            ->asArray()
            ->one();
        ;
Ответить