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;
}
MyUser
及其权限已更新,但我仍会恢复旧$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。如果你发这个,我可以投它作为解决方案