Laravel - зафиксировать динамически созданную коллекцию в базе данных для данной модели - PullRequest
0 голосов
/ 05 февраля 2019

Я создал коллекцию в Laravel, используя:

use Illuminate\Database\Eloquent\Collection; // As per Mihir Bhende's answer, make sure we're using the correct Eloquent `Collection`

$collection = new Collection;

Затем я переместил несколько предметов (все одного типа модели) в эту коллекцию:

$item = $items->first(function($item) {
    return $item->field == "value";
});

$collection->push($item);

И, наконец,Я пытаюсь обновить все записи, которые сейчас находятся в $collection, с использованием $collection->update() или $collection->save(), но я получаю следующую ошибку:

"Метод Illuminate \ Support\ Collection :: update не существует. "

Но так как я использую new Collection (и я также пытался collect()), и я звоню update() non-Статически я не ожидал этой ошибки.

Как я могу обновить записи моей базы данных в $collection все сразу? В качестве альтернативы, есть ли способ «поставить в очередь» изменения на несколькихразличные дочерние объекты, которые не будут жертвовать производительностью?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете использовать транзакции, чтобы «ставить в очередь» обновления для моделей и обеспечивать атомарные обновления.

DB::transaction (function () use ($collection) {
    $collection->each(function ($item) {
        $item->save();
    });
});

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

DB::transaction(function () {
    $items->each(function ($item) {
        $item->field = "value";
        $item->save();
    });
});

Таким образом, вам не нужно зацикливаться на коллекции несколько раз.

См. документацию Laravel по транзакциям: https://laravel.com/docs/5.6/database#database-transactions

0 голосов
/ 05 февраля 2019

Когда вы используете collect ([]), он создает Illuminate\Support\Collection, где в качестве красноречивых моделей, где мы можем использовать функции обновления базы данных, Illuminate\Database\Eloquent\Collection

Вы можете использовать Model :: hydrate ($ array)для преобразования массива в красноречивую коллекцию.

Но в вашем случае, если вы пытаетесь сохранить несколько записей, см. Model::create() или Model::update().Se документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...