Сохраните две новые модели, связанные друг с другом, в Laravel 6 - PullRequest
0 голосов
/ 03 октября 2019

Мне интересно, как лучше всего сохранить две разные модели, имеющие отношения друг к другу одновременно. Предположим, у меня есть модель подписки и модель участника, и когда я создаю участника, он должен создать подписку и связать с ней участника.

Пример:

class Subscription extends Model
{
    public function participants()
    {
        return $this->hasMany('App\Participant');
    }
}

class Participant extends Model
{
    public function subscription()
    {
        return $this->belongsTo('App\Subscription');
    }
}

Сохранение:

$s = new App\Subscription();

$p = new App\Participant();

$s->participants()->save($p);

Но тогда подписка не сохраняется. Есть идеи, как лучше всего сохранить их обоих, проверить, сохранены ли они, и установить связь?

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вы можете сделать это с транзакциями (как в ответе @ IGP), или просто добавить строку сохранения для подписок тоже.

public function test()
{
    // Begin Transaction
    DB::beginTransaction();

    try
    {
        $participant = new Participant();

        $subscription = new Subscription();
        // $subscription->name = "parent subscription"; // init necessary columns
        $subscription->save();

        $participant->subscription()->associate($subscription);
        // $participant->name = "child participant"; // init necessary columns
        $participant->save();

        // Commit Transaction
        DB::commit();

        // Continue your logic here

    } catch (\Exception $e) {
        // Rollback Transaction
        DB::rollback();

        return $e->getMessage();
    }
}
0 голосов
/ 03 октября 2019

То, что вы ищете, это транзакции. Вы можете сделать их 2 способами.

Использование DB::transaction() и помещение всего в замыкание

use DB;

$s = new App\Subscription();
$p = new App\Participant();

DB::transaction(function () use ($s, $p) {
    // If something fails, it will rollBack, if not, it will commit.
    $s->save();
    $s->participants()->save($p);
});

Или вручную, где вы контролируете, когда оно передается или выполняется откат.

use DB;

$s = new App\Subscription();
$p = new App\Participant();

try {
    DB::beginTransaction();
    $s->save();
    $s->participants()->save($p);
    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
}

Подробнее о сделках

...