CakePHP relacje między tabelami część 2
Kontynujemy poprzednią część. Tym razem zajmiemy się zapisem powiązanych danych w bazie. Zaczniemy od najprostszej metody zapisu powiązanych danych. W kontrolerze PhoneNumbersController (src/Controller/PhoneNumbersController.php) w funkcji add musimy załadować userów.
public function add() { ... $users = $this->PhoneNumbers->Users->find('list'); $this->set(compact('phoneNumber', 'users')); ... }Ponadto w pliku templatu src/Templates/PhoneNumbers/add.ctp dodajmy pole do wyboru użytkownika.
<?php echo $this->Form->create($phoneNumber); ... echo $this->Form->input('user_id'); ...CakePHP automatycznie zapełni listę rozwijaną w polu user_id listą użytkowników przechowywanych w zmiennej $users. Problem z powyższą metodą jest taki, że użytkownik jest zmuszony do wybierania użytkownika za każdym razem, gdy dodaje numer telefonu, ponieważ użytkownik jest polem wymaganym w naszym przykładzie. Aby to uprościć, możesz wyświetlić użytkownika, a następnie dodać link "dodaj", który przeniesie Cię do funkcji add, przekazując identyfikator użytkownika. W widoku (view) użytkowników (/src/Template/Users/view.ctp) dodajemy link:
<h4><?php echo __('Phone Numbers'); ?></h4> <?php echo $this->Html->link(__('Add Phone Number'), ['controller' => 'PhoneNumbers', 'action' => 'add', $user->id]); ?>Następnie modyfikujemy funkcję dodawania numerów telefonów w kontrolerze (src/Controller/PhoneNumbersController.php), aby przyjąć identyfikator użytkownika i przekazać go do widoku.
public function add($user_id = null) { ... $this->set(compact('phoneNumber', 'users', 'user_id')); ... }Na koniec ustawiamy wartość user_id w widoku src/Templates/PhoneNumbers/add.ctp.
echo $this->Form->input('user_id', ['value' => $user_id]);Możemy również dodawać powiązane rekordy bezpośrednio z bieżącego modelu. Najpierw dodajemy pola do widoku add użytkowników (src/Template/Users/add.ctp), aby dodać numery telefonów.
<h4><?php echo __('Phone Numbers'); ?></h4> <table><tr><th>Type</th><th>Number</th></tr> <tr> <td><?php echo $this->Form->input('phone_number.type', ['options' => ['H' => 'H', 'W' => 'W', 'M' => 'M']]); ?></td> <td><?php echo $this->Form->input('phone_number.number'); ?></td> </tr> </table>Kiedy zapiszesz swojego użytkownika, CakePHP automatycznie zapisze powiązane dane z nowym user_id, o ile przestrzegane są konwencje.