За последние 24 часа нас посетили 20968 программистов и 1109 роботов. Сейчас ищут 369 программистов ...

Модель создает еще одну строку в бд

Тема в разделе "Laravel", создана пользователем lordconst, 9 май 2020.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Имеется две таблицы tickets и result_ticket (тикеты и результаты конкретного тикета). Полагаю, при создании тикета можно сделать так, чтобы вслед за строкой в tickets создавалась строка и в result_ticket, причем чтобы у результата айди был привязан к этому же тикету.
    В документации не нашел такого, все примитивно, там создается лишь одна запись в бд. А как можно помимо этой строки создать еще одну строку в другой таблице (они связаны отношением tickets-result_ticket как один-к-одному), да еще и связать их (в таблице result_id имеется поле ticket_id).
    Пока что имеется такой рабочий код.
    PHP:
    1. public function store(TicketsRequest $request) {
    2.  
    3.     $person = User::with('person.tickets')
    4.         ->find(Auth::user()->id);
    5.     $ticket = new Ticket();
    6.     $ticket->person_id = $person->person->id;
    7.     $ticket->type = $request->ticket_type;
    8.     $ticket->name = $request->ticket_name;
    9.     $ticket->description = $request->ticket_description;
    10.     $ticket->date_off = $request->ticket_date_off;
    11.  
    12.     $ticket->save();
    13.  
    14.  
    15.     return redirect()->route('tickets.index')->with('success', 'Тикет успешно добавлен');
    16.  
    17. }
    Есть у меня одна мысль. Может быть, в этом методе можно вызвать метод store контроллера ResultTicketController? Но даже если и так, то как передать только что созданный айди тикета?
     
    #1 lordconst, 9 май 2020
    Последнее редактирование: 9 май 2020
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    1. А почему создание экземпляра, а не статический вызов?
    PHP:
    1. $ticket = Ticket::create($request);
    2. А что-же нет никакой валидации?
    3. Можно и нужно, например так же
    PHP:
    1. ResultTicket::create($data):
    , а id в $ticket->id
     
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    1. Потому что создание экземпляра мне удобнее.
    2. Валидация есть, она в TicketRequest. Зачем загромождать методы контроллера?
    3. ticket_id в этом методе уже доступен? Т.е. Laravel заранее подготовил значение айди? Что в $data надо передать?
    Полагаю, строка будет выглядеть так:
    PHP:
    1. $result_ticket = ResultTicket::create(['ticket_id' => $ticket->id, 'еще какое-то поле в таблице' => 'какое-то значение'])
    ?
     
    #3 lordconst, 10 май 2020
    Последнее редактирование: 10 май 2020
  4. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Да, решил проблему. Именно такая строка и сработала.
    Только возникла ошибка, но пофиксил ее добавлением в модель:
    PHP:
    1. protected $fillable = ['ticket_id', 'total', 'yes', 'no', 'other'];
    Добавил блок кода в метод store:
    PHP:
    1. if($request->ticket_type == 'Голосование') {
    2.             $result_ticket = ResultTicket::create(['ticket_id' => $ticket->id, 'total' => 0, 'yes' => 0, 'no' => 0, 'other' => 0]);
    3.         }
    Вдруг кому-нибудь когда-нибудь пригодится это
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Если прописана связь, можно использовать метод save: https://laravel.com/docs/7.x/eloquent-relationships#inserting-and-updating-related-models, хотя он наиболее удобен, когда многие-ко-многим, или полиморфная связь, т.е. когда надо заполнить больше чем одно поле. Для один-ко-многим и один-к-одному не всегда им пользуюсь.

    @lordconst ты вроде вообще русскую доку смотришь, и не нашёл?
     
  6. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    я научился автопереводчиком страницы пользоваться)