Laravel сохранить в базе данных с несколькими таблицами, имеющими много связей с таблицей - PullRequest
0 голосов
/ 26 июня 2018

У меня есть таблица транзакций в базе данных.Отношение к таблице транзакций таково, что клиент может отправить много транзакций.В ветви может быть много транзакций, а обработчик транзакций может обслуживать много транзакций.Я определил модели и отношения.Но не знаю, как сохранить отношения, так как сохранение одного вначале сделает FK нулевым.Есть ли способ сохранить все сразу или моя база данных неверна?

Моя схема

enter image description here

И мой код контроллерасохранить отношение

//Save models related to transactions
        $transaction = new Transaction($request->input('partCTransaction'));
        //Customer can have many transactions
        $customer->transactions()->save($transaction);
        //branch has many reporting entities and a branch handles many transactions
        $branch->transactions()->save($transaction);
        //A transaction handler handles different transactions
        $transactionHandler->transactions()->save($transaction);

Любая идея о том, как решить эту проблему.

Моя ошибка

General error: 1364 Field 'branch_id' doesn't have a default value (SQL: insert into `transactions` (`date`, `ref_number`, `customer_id`, `updated_at`, `created_at`) values (, , 9, 2018-06-25 23:36:11, 2018-06-25 23:36:11))

1 Ответ

0 голосов
/ 26 июня 2018

Ваша модель Transaction должна иметь отношения customer, branch и transactionHandler belongsTo:

public function customer()
{
    return $this->belongsTo(Customer::class);
}

public function branch()
{
    return $this->belongsTo(Branch::class);
}

public function transactionHandler()
{
    return $this->belongsTo(TransactionHandler::class);
}

В отношении belongsTo есть метод associate(), который устанавливаетполе отношения, но не сохраняет запись.Вы можете использовать эти отношения, чтобы настроить все соответствующие отношения, а затем вызвать save(), когда вы закончите.

$transaction = new Transaction($request->input('partCTransaction'));
$transaction->customer()->associate($customer);
$transaction->branch()->associate($branch);
$transaction->transactionHandler()->associate($transactionHandler);
$transaction->save();

Просто примечание, associate() возвращает дочернюю модель, так что вы можете связатьвсе это вместе, если вы предпочитаете этот вид:

$transaction = new Transaction($request->input('partCTransaction'));
$transaction
    ->customer()->associate($customer)
    ->branch()->associate($branch)
    ->transactionHandler()->associate($transactionHandler)
    ->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...