Laravel oneToMany Insert/Update/Delete

265
30 апреля 2017, 00:43

Есть две таблицы: User

---------
|id|name|
|10|John|
---------

Article

--------------------
|id|user_id| article|
|21|     10|testName|
|22|     10| testVal|
--------------------

В реквесте приходит массив артиклов:

article[]
article[1][id] = "21"
article[1][article] = "first"
article[2][article] = "second"

Нужно положить их в таблицу, чтобы записи которые есть(если в реквесте пришел id) обновились, у которых нет id создать, а которые не пришли в реквесте удалилить. На выходе должна получится таблица Article такого вида:

--------------------
|id|user_id| article|
|21|     10|   first|
|23|     10|  second|
--------------------
Answer 1

Вот набросал свою реализацию, если я всё правильно понял, то должно отработать без ошибок:

//Вот так выглядит ваш POST как я понял    
$_POST['articles'] = [
        1 => [
            'id' => 21,
            'article' => 'first'
        ],
        2 => [
            'article' => 'second'
        ]
    ];

Вот так мы его обрабатываем, собираем записи и обновляем данные через метод sync:

$articles = [];
foreach ($_POST['articles'] as $data) {
    $attributes = [
        'article' => $data['article']
    ];
    //Проверяем именно так, всякие updateOrCreate и т.п. не подойдут потому что id есть не всегда у вас в запросе и будет ошибка
    if (array_key_exists('id', $data)) {
        $article = App\Article::where('id', $data['id'])
        ->update($attributes);
    } else {
        $article = App\Article::create($attributes);
    }
    array_push($articles, $article->id);
}
$user = App\User::find(1);
//Метод sync добавит записи которых не было и удалит все те что не указаны в массиве
$user->articles()->sync($articles);

Так же вы хотели удалять все записи что не были в запросе, это можно сделать вот так:

//Удаляем все записи, которых нет в форме
App\Article::whereNotIn('id', $articles)->delete();
READ ALSO
GET не пропускает & Помогите

GET не пропускает & Помогите

Всем приветЕсть скрипт и такую ссылку он не пропускает

237
Ошибка warning: fwrite(): SSL: Broken pipe

Ошибка warning: fwrite(): SSL: Broken pipe

Подскажите, в чём может быть проблема? В админке есть отдельная страница выбора файла csv или xlsx для импорта новых пользователейВ цикле берётся...

288
Нужна помощь phpQuery::each

Нужна помощь phpQuery::each

Не могу понять принцип работы вышеуказанного метода phpQuery::each

345