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.
