Laravel:雄辩地说明如何一次更新模型和相关模型

Mvd*_*vdP 25 laravel eloquent laravel-4

有谁知道是否可以做以下事情:

假设我们有一个名为User的模型和一个名为BestFriend的模型.用户与最好的朋友之间的关系是1:1.

我希望这些案例能够做到这样的事情,同时改变我的城市和我朋友的城市.

$me = User::find(1);

$me->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));
Run Code Online (Sandbox Code Playgroud)

所以基本上我想知道Eloquent是否足够聪明,能够理解基于数组键'bestfriend.city'的关系.

在此先感谢您的帮助!

更新:

在Laravel论坛上找到解决方案,但我也在这里发布,如果其他人正在寻找相同的东西:)

在您添加的模型中

// In your model...
public function setBestFriendArrayAttribute($values)
{
    $this->bestfriend->update($values);
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以这样称呼它

$me->update(array(
    'city' => 'amsterdam',
    'BestFriendArray' => array(
        'city' => 'amsterdam'
    )
));
Run Code Online (Sandbox Code Playgroud)

奇迹般有效!

dak*_*ine 10

您无需在模型上进行设置.你可以在你的控制器上这样做.

$me = User::find(1)->bestFriend()->update(array(
'city' => 'amsterdam',
'bestfriend.city' => 'amsterdam'
));
Run Code Online (Sandbox Code Playgroud)

我刚刚修改了你的更新.


use*_*496 4

Eloquent 非常聪明,但我不相信它能做到这一点。您必须独立更新 User 和 BestFriend。但是一旦你做到了这一点,Eloquent 确实有连接这两者的方法。

$me = User::find(1);
$bff= BestFriend::find(1);

$me->city = 'amsterdam'; 
$bff->city = 'amsterdam';

$me->bestfriend()->associate($bff);
Run Code Online (Sandbox Code Playgroud)

当然,假设您的 User 模型具有如下所示的函数......

public function bestfriend()
{
    return $this->hasOne('BestFriend');
}
Run Code Online (Sandbox Code Playgroud)