To naprawdę brzmi jak zadanie dla Set::combine()
. Twoje pole wyświetlania nie powinno odwoływać się do innego modelu, ponieważ nie zawsze jest gwarantowane, że zostanie połączone. Jeśli więc połączenie nie doprowadziło do przesłania danych, spowodowałoby to błąd.
Zamiast tego, używając Set::combine()
, możesz utworzyć tablicę klucz-wartość z dowolną potrzebą. Chociaż jest to mniej "magiczne", spowoduje to mniejsze możliwości błędów.
Dla przykładu UsersController, załóżmy, że masz profil "jedyny" i chcesz, aby użytkownik wybrał użytkownika za pomocą automatycznie wypełnianego menu rozwijanego (tzn. Przy użyciu formularza), które pokazuje pełne nazwy użytkowników z ich profilu. Użyjemy Containable do wprowadzenia danych profilu.
class AppModel extends Model {
$actsAs = array(
'Containable'
);
}
Następnie w UsersController:
function choose($id = null) {
// regular view code here
$users = $this->User->find('all', array(
'contain' => array(
'Profile'
)
));
// create a key-value that the FormHelper recognizes
$users = Set::combine($users , '{n}.User.id', '{n}.Profile.full_name');
}
Zauważysz, że full_name
jest teraz na modelu profilu, ponieważ używa pól z tego modelu. Sposób łączenia tworzy tablicę jak
array(
1 => 'skerit',
2 => 'jeremy harris'
);
Która zostanie automatycznie używane podczas korzystania z FormHelper Aby utworzyć listę rozwijaną
echo $this->Form->input('user_id');
Dzięki, to pomogło mi zrozumieć połączyć(). Nie zapominaj, że w twoim przykładzie będzie trzeba dodać do dodania. – 472084
Fajnie, cieszę się, że pomógł komuś. Dodałem możliwość dodania do przykładu, aby odpowiedź była bardziej kompletna. – jeremyharris