Добавить массив данных в модель

87
15 марта 2021, 22:40

Всем привет.

Помогите найти праильное решение. Мне на сервер приходят данные вот в таком виде. Фото ниже:

Первые два поля я добавлю в нужную мне таблицу.

Вопрос с другими полями (ingredient-id, amount). В БД есть таблица. Фото ниже:

Мне нужно для рецепта добавить все ингредиенты. На сервер пришли id ингредиентов. Нужно как-то прокрутить грамотно этот массив и сделать запрос в БД.

  1. Как можно вернуть id только что добавленного рецепта, чтобы потом к нему добавлять ингредиенты?

  2. Можно ли как-то собрать из пришедшего массива id-ингредиентов и количество и вставить в БД для одного рецепта, но чтобы не в цикле, а одним запросом?

Answer 1

Это классическое отношение между моделями "многие ко многим". в Laravel это называется many-to-many. Я так понимаю из скриншота у вас как раз смежная (intermediate) таблица, в которую помещаются id рецепта и id ингридиента.

Соответственно,чтобы то, что вы хотите сделать, грамотно заработало у вас должно быть 3 таблицы:
1) recipes
2) ingredients
3) ingredient_recipe

Модель Recipe:

class Recipe extends Model
{
   public function ingredients()
    {
        return $this->belongsToMany('App\Ingredient','ingredient_recipe');
    }
}

Модель Ingredient:

class Ingredient extends Model
    {
       public function recipes()
        {
            return $this->belongsToMany('App\Recipe','ingredient_recipe');
        }
    }

Необходимо первоначально создать какой-либо рецепт:

$new_recipe = Recipe::create(["name" => "my_recipe","description" => "very tasty"]);

Это ответ на первый вопрос, где $new_recipe->id будет id нового рецепта. Далее надо собрать массив из id ингредиентов, например через метод коллекции pluck(), допустим $arr_ingredients = [1,2,3] и выполнить:

$new_recipe->ingredients()->sync($arr_ingredients);

Это ответ на второй вопрос.

READ ALSO
Teamleader api Key email must be present

Teamleader api Key email must be present

Делаю запрос POST на teamleader API, в котором надо указать имя пользователя и его емаил, но каждый раз пишет это:

107
Как правильно запустить Workerman через SSH?

Как правильно запустить Workerman через SSH?

Я использую Codeigniter и WorkermanВ примере на сайте разработчика указан пример запуска сервера:

100
Форма авторизации HTML&PHP в модальном окне

Форма авторизации HTML&PHP в модальном окне

Есть форма с авторизациейКогда вводим логин и пароль которые не содержаться в СУБД, то страница просто обновляется

106
Symfony: запуск фонового процесса и отслеживание его состояния

Symfony: запуск фонового процесса и отслеживание его состояния

Возник вопрос следующего характераЕсть кнопка, при нажатии на которую посылается AJAX-запрос на контроллер

90