Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 24.05.2017 17:54:10

сохранение инфы в промежуточную таблицу

Бьюсь голой уже несколько суток, помогите решить ребус

http://prntscr.com/fbl0e1 структура БД

Модель один

class Dish extends Model
{
    protected $table = 'dishes';
    protected $fillable = ['name', 'specification', 'recipe'];


    public function ingredients()
    {
        return $this->belongsToMany('App\Ingredient','dish__ingredients')
            ->withPivot(['quantity', 'units_id'])
            ->withTimestamps();

    }

}

Модель два

class Ingredient extends Model
{
    protected $table = 'ingredients';
    protected $fillable = ['name'];

    public function dishes()
    {
        return $this->belongsToMany('App\Dish','dish__ingredients');
    }

    public function units()
    {
        return $this->hasOne('App\Unit');
    }

}

Модель три

class Unit extends Model
{
    protected $table = 'units';
    protected $fillable = ['name'];

    public function ingredients()
    {
        return $this->belongsTo('App\Ingredient');
    }

}

принимаю из формы массивы информации, как мне их записать в таблицу что бы связать? ((

        $dish = Dish::FirstOrCreate([
            'name' => $request['name_recipe'],
            'specification' => $request['receiptComment'],
            'recipe' => $request['receipt_description']
        ]);

        foreach ($_POST['ingr'] as $v) {
            $ingr[] = Ingredient::FirstOrCreate(['name' => $v])->id;
        }


        foreach ($_POST['unit'] as $v) {
            $unit[] = Unit::FirstOrCreate(['name' => $v])->id;
        }

        $quan = $_POST['quantity'];

        $dish->ingredients()->attach($ingr, ['quantity' => $quan[1], 'units_id' => $unit[1]]); // если записывать так то только одно значение записывается во всех полях, а мне нужно на каждой итерации новое СЛЕДУЩЕЕ значение этих массивов 


$dish->ingredients()->attach($ingr)

withPivot добавлены поля для заполнения вторым параметром, если передавать строку все норм записывается только одна строка, а у меня массив данных
$dish->ingredients()->attach($ingr, ['quantity' => $quan, 'units_id' => $unit]) если $quan и $unit передать масивом будет ошибка Array to string conversion (понятно что нужно предать строку а не массив)
http://prntscr.com/fbl6kd

помогите пожалуйста

Не в сети

#2 24.05.2017 18:11:03

Re: сохранение инфы в промежуточную таблицу

я одного не понимаю, зачем от юниты отдельная таблица и почему на каждую отдельную запись туда добавляются новые значения? там разве нету уже готового «справочника» возможных значений? если так то видимо в форме должен быть селект который выбирает варианты из справочника и тогда в $_POST['unit'] должны приходить айдишники уже существующих единиц измерения.

в этом случае у тебя будет только один цикл

foreach ($_POST['ingr'] as $key => $v) {
    $dish->ingredients()->attach(
        Ingredient::FirstOrCreate(['name' => $v]), 
        ['quantity' => $_POST['quantity'][$key], 'units_id' => $_POST['unit'][$key]]
    );
}

но у этого кода тоже есть недостаток – все получаемые данные должны извлекаться из объекта запроса, а не напрямую из $_POST, а их корректность должна проверяться стандартными или кастомными валидаторами

Не в сети

#3 24.05.2017 19:52:19

Re: сохранение инфы в промежуточную таблицу

constb пишет:

зачем от юниты отдельная таблица и почему на каждую отдельную запись

Эту таблицу мне тимлид утвердил

Не в сети

#4 24.05.2017 20:05:10

Re: сохранение инфы в промежуточную таблицу

constb пишет:

я одного не понимаю, зачем от юниты отдельная таблица и почему на каждую отдельную запись туда добавляются новые значения? там разве нету уже готового «справочника» возможных значений? если так то видимо в форме должен быть селект который выбирает варианты из справочника и тогда в $_POST['unit'] должны приходить айдишники уже существующих единиц измерения.

в этом случае у тебя будет только один цикл

foreach ($_POST['ingr'] as $key => $v) {
    $dish->ingredients()->attach(
        Ingredient::FirstOrCreate(['name' => $v]), 
        ['quantity' => $_POST['quantity'][$key], 'units_id' => $_POST['unit'][$key]]
    );
}

но у этого кода тоже есть недостаток – все получаемые данные должны извлекаться из объекта запроса, а не напрямую из $_POST, а их корректность должна проверяться стандартными или кастомными валидаторами

про селект так и есть, но если я захочу сделать не селект а свободную форму... В общем самое главное я не пойму как как добавлять еще записи если dish id 1  а остальные записи много, через форыч?

Не в сети

#5 24.05.2017 20:08:43

Re: сохранение инфы в промежуточную таблицу

constb пишет:
foreach ($_POST['ingr'] as $key => $v)

а сколько циклов будет? разве не один? а мне 4 нужно

Не в сети

#6 24.05.2017 20:35:37

Re: сохранение инфы в промежуточную таблицу

а сколько циклов будет? разве не один? а мне 4 нужно

можно в одном цикле сразу заполнять всю группу связанных значений

Эту таблицу мне тимлид утвердил

если у тебя есть тимлид – зачем тогда тут спрашивать? smile или он необщительный? smile

Не в сети

#7 24.05.2017 20:46:00

Re: сохранение инфы в промежуточную таблицу

constb пишет:

если у тебя есть тимлид – зачем тогда тут спрашивать? smile или он необщительный? smile

я на обучении

Не в сети

#8 24.05.2017 20:51:48

Re: сохранение инфы в промежуточную таблицу

ну так и я о том же smile у тебя есть тимлид, которому платят в том числе и за то чтобы он тебя учил smile зачем вообще форум тогда нужен? smile

Не в сети

#9 25.05.2017 09:10:46

Re: сохранение инфы в промежуточную таблицу

constb пишет:

ну так и я о том же smile у тебя есть тимлид, которому платят в том числе и за то чтобы он тебя учил smile зачем вообще форум тогда нужен? smile

блин )) ну это не то что бы тимлид, нас пачку набралин ньюби, на всех время не уделять, самый смышленые остануться, не кто не кому не помогает....

скажи а что в $key -  $_POST['unit'][$key]]?

Не в сети

#10 25.05.2017 09:48:59

Re: сохранение инфы в промежуточную таблицу

скажи а что в $key -  $_POST['unit'][$key]]?

присмотрись повнимательнее к foreach, $key – порядковый номер обрабатываемого элемента в первом массиве – к нему и подбираются по тому же номеру элементы из остальных массивов

Не в сети

#11 25.05.2017 12:09:06

Re: сохранение инфы в промежуточную таблицу

constb пишет:

скажи а что в $key -  $_POST['unit'][$key]]?

присмотрись повнимательнее к foreach, $key – порядковый номер обрабатываемого элемента в первом массиве – к нему и подбираются по тому же номеру элементы из остальных массивов

супер получилось! как теперь выводить информацию из объединяющей таблицы. полную в формате

Рецепт
короткое описание
полный рецепт // эти три из таблицы dishes

ингредиент1 150 гр
ингредиент2 150 гр
ингредиент3 150 гр
ингредиент4 150 гр

Не в сети

Подвал раздела