Как получить отношение «таблица 1» ИЛИ «таблица 2» ИЛИ «таблица 3» в одну таблицу в laravel?

Я новичок здесь, а также в Laravel, поэтому, пожалуйста, извините меня. У меня есть таблица с именем «продукты», и эта таблица связана с таблицей «рецепты» через отношение «многие к одному» (в одном из рецептов много продуктов). - таблица "рецептов" хранит справочный код- Вот где я застрял; таблица «рецепты» имеет отношение «один к одному» к трем различным таблицам, в которых хранятся «настоящие» рецепты продуктов. Эти таблицы имеют разное содержание рецептов, например,

щелочной стол;

   Schema::create('alkalines', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('recipe_id');
        $table->integer('sodium_bicarbonate');
        $table->timestamps();
    });

стол ацетов;

   Schema::create('acets', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('recipe_id');
        $table->integer('sodium_chloride');
        $table->integer('acetic_acid');
        $table->timestamps();
    });

Я могу получить все отношения, если начну с одного из них (например, с модели Acet). Но если я перечисляю все продукты и пытаюсь получить их рецепт, мне приходится использовать кучу «если» и «иначе». Просто не могу получить рецепт, как;

$product->recipe-> "one of the three recipe tables' content"

И моя таблица «рецептов»:

Schema::create('recipes', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('ref');
        $table->timestamps();
    });

Я считаю, что это легко, просто что-то упустил. Пожалуйста помоги! Заранее спасибо!


person oceceli    schedule 16.07.2019    source источник


Ответы (3)


Я думаю, вы можете получить каждое отдельное отношение, в котором они объединяют массивы, например

$arr1=Alkalines::with('recipe')->get()->toArray();
$arr2==Acets::with('recipe')->get()->toArray();
$arr3=***************************;
array_merge($arr1,$arr2,$arr3)
person mohamed hassan    schedule 16.07.2019
comment
Спасибо за ваше время. Это имеет смысл, но выдает ошибку. Все, что мне нужно, это переменная, которая хранит данные из всех трех таблиц. Можете ли вы объяснить немного? - person oceceli; 17.07.2019
comment
Что-то типа; коллекции не могут быть назначены массиву. Когда я пытаюсь вернуть return array_merge($arr1,$arr2,$arr3) - person oceceli; 17.07.2019
comment
добавить ->toArray() после get(); - person mohamed hassan; 17.07.2019

Добро пожаловать в СО.

Если у вас правильно настроены отношения, вы можете использовать 'collection->pluck()' для получения их результатов, независимо от того, насколько глубоко они вложены в разные отношения.

Пример:

$game->players->stats не будет работать, потому что players — это коллекция, в которой нет атрибута, метода или поля stats.

Итак, что вы можете сделать, так это использовать pluck() и Collar() для получения результата отношений:

$game->players->pluck('stats')->collapse()

person JCode    schedule 16.07.2019
comment
Спасибо за ваше время. Это дает ошибку, когда я реализую ваш код следующим образом: Я думаю, что отношение hasOne возвращает массив вместо коллекции. Что я могу сделать? - person oceceli; 17.07.2019
comment
Если вы не получаете вложенное отношение, попробуйте вместо этого $recipe->sodium_bicarbonate без collapse() или pluck(), потому что pluck() требует коллекции. - person JCode; 17.07.2019

Я немного отредактировал код @mohamedhassan, и это сработало!

public function solutionMerge()
{
    $arr1=Alkaline::with('recipe')->get();
    $arr2=Acet::with('recipe')->get();
    $arr3=Glucose::with('recipe')->get();

    $solutionMerge = collect([$arr1,$arr2,$arr3]);

    return $solutionMerge;
}

Просто назначил массивы в коллекцию. А затем используйте collapse(). И теперь я могу получать такие данные, как $solutionMerge->recipe->id Спасибо вам, люди, за ваше драгоценное время и огромные знания!

person oceceli    schedule 18.07.2019