Где сохранять сразу разные модели в Laravel? - PullRequest
0 голосов
/ 11 июля 2020

У меня к вам небольшой вопрос.

Я использую Laravel и не уверен, что лучше всего (и где) сохранять разные модели одновременно.

Например:

Когда пользователь создает «RecordSheet», мне нужно автоматически создавать другие модели, связанные с моделью RecordSheet. Очевидно, я создам модель RecordSheet в его собственном контроллере:

class RecordSheetController extends Controller
{
   public function store(){
    RecordSheet::create([
    .......
    'user_id' => Auth::user()->id
    ]);
   }
}

Где мне разместить создание других моделей? В том же RecordSheetController?

class RecordSheetController extends Controller
{
  public function store(){
    DB:beginTranaction()
    
    try{
    $record = RecordSheet::create([
    .......
    'user_id' => Auth::user()->id
    ]);

    ModelB::create([
    .......
    'recordSheet' => $record->id,
    'user_id' => Auth::user()->id
    ]);

    }catch(Exception $e)
    {
      DB:rollback();
    }
    DB:committ();
  }
}

Я не уверен насчет этого, так как полагаю, что RecordSheetController должен отвечать только за модели «RecordSheet», а не за другие модели.

Любое предложение будет оценил! Всем спасибо!

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Laravel предоставляет некоторые встроенные соглашения для размещения вашего действия или кода CRUD (Create - Read - Update - Delete).

Как правило, вы можете поместить связанное действие модели в один и тот же метод. Для начала вы можете использовать команду artisan:

php artisan make:controller RecordSheetController --resource

Это добавит стандартные методы в ваш контроллер. Эти методы включают ie в любые resource методы, которые используются в вашей маршрутизации, которые соответствуют стандартам GET / POST / PUT / et. c.

После настройки вашего контроллера обычно Самый простой и удобный способ выполнения связанных действий в рамках одного и того же метода, поэтому вам не нужно go вперед и назад с пользователем от страницы к контроллеру и обратно. Итак:

public function store(Request $request){ 
    // Add transactions as you wish
    $record = RecordSheet::create([
     .......
    ' user_id' => Auth::user()->id
    ]);

    ModelB::create([
    .......
    'recordSheet' => $record->id,
   'user_id' => Auth::user()->id
   ]);
}

Вы, конечно, можете создавать в нем подфункции, но главное - выполнять это одновременно для повышения эффективности. Если есть много повторяемых подфункций с менее связанными действиями, может быть полезно переместить их в другие части вашего приложения. Но для простого, непосредственно связанного творчества, как правило, удобнее держать их в одном классе.

1 голос
/ 11 июля 2020

вы можете использовать Laravel Observers для этого сценария, создать RecordSheetObserver и поместить свой ModelB код в метод created

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