Laravel: Красноречивый способ обновить модель и связанные с ней модели за один раз
Кто-нибудь знает, возможно ли это сделать следующее:
Скажем, у нас есть модель под названием User и модель под названием BestFriend. Связь между пользователем и лучшим другом - 1:1.
Я бы хотел, чтобы в этих случаях можно было сделать что-то подобное, изменить мой город и город моего друга в то же время.
$me = User::find(1);
$me->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));
Итак, в основном я хотел бы знать, достаточно ли Eloquent, чтобы понять отношения на основе ключа массива "bestfriend.city".
Заранее благодарим за помощь!
Update:
Нашел решение на форумах Laravel, но я также разместил его здесь, если кто-то ищет то же самое:)
В модели вы добавляете
// In your model...
public function setBestFriendArrayAttribute($values)
{
$this->bestfriend->update($values);
}
И тогда вы можете так называть
$me->update(array(
'city' => 'amsterdam',
'BestFriendArray' => array(
'city' => 'amsterdam'
)
));
Работает как шарм!
Ответы
Ответ 1
Вам не нужно устанавливать его на своей модели. Вы можете сделать это на своем контроллере, как это.
$me = User::find(1)->bestFriend()->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));
Я немного изменил ваше обновление.
Ответ 2
Красноречивый довольно умный, но я не думаю, что он может это сделать. Вам придется обновлять User и BestFriend самостоятельно. Но как только вы это сделали, у Eloquent есть методы для присоединения двух.
$me = User::find(1);
$bff= BestFriend::find(1);
$me->city = 'amsterdam';
$bff->city = 'amsterdam';
$me->bestfriend()->associate($bff);
Это, конечно, предполагает, что ваша модель пользователя имеет функцию, которая выглядит как...
public function bestfriend()
{
return $this->hasOne('BestFriend');
}