Laravel 附加新关系并返回模型

Laravel 附加新关系并返回模型,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我有一个用户,他有许多位置。我想更新用户(模型和关系位置),然后返回更新结果 输入将是格式的数组 { first_name, last_name, email, ... (other user information), positions : [ { id, name, descriton }, ... ] } 我的更新功能当

我有一个
用户
,他有许多
位置
。我想更新
用户
(模型和关系
位置
),然后返回更新结果

输入将是格式的数组

{
    first_name,
    last_name,
    email,
    ... (other user information),
    positions : [
        {
            id,
            name,
            descriton
        },
        ...
    ]
}
我的更新功能当前为

public function update($id)
{
    // This is a validation that works fine
    if ( ! User::isValid(Input::all())) return $this->withValidation(User::$errors);

    $user = User::with('positions')->find($id);

    $new_ids = array_pluck(Input::get('positions'), 'id'); 
    $user->positions()->sync($new_ids);

    $user->update(Input::all());

    return $user;
}
My
User
及其权限已更新,但我仍会恢复旧$User的关系(即,基本信息已更新,新位置在DB中更新,但返回的结果是旧位置的新基本信息)


现在要解决这个问题,我回忆一下结尾处的
User::with('positions')->find($id)
,并返回它。但是为什么上面的代码不起作用?

正确,
sync
不会更新父模型上的相关集合

但是,您应该使用
$user->load('positions')
重新加载关系,它将只调用1个查询,而不会再次获取用户

此外,您还可以对集合调用
load

$user->positions->load('anotherRelation');
$user->positions()->load('anotherRelation');
因为这里的位置是一个集合,它具有load方法来延迟加载集合中每个项的所有相关模型

这不起作用,因为
positions()
返回的是关系对象,而不是集合:

$user->positions->load('anotherRelation');
$user->positions()->load('anotherRelation');

是,
sync
不会更新父模型上的相关集合。但是,您应该使用
$user->load('positions')
重新加载关系,它将只调用1个查询,而不会再次获取用户。太棒了!如果我
同步
多个关系,我当然可以
加载
所有正确吗?并且
load
是否会处理关系的关系,例如
user->positions()->load('attributes')
?它不会处理
positions()
,因为它是一个关系对象。但是它将在
user->positions->load(…)
上工作,因为这里
positions
是一个集合,它有
load
方法延迟加载集合中每个项目的所有相关模型。好的,谢谢@deczo。如果你发这个,我可以投它作为解决方案