调用未定义的方法Illuminate \ Database \ Eloquent \ Collection :: save()laravel

时间:2016-02-19 09:41:42

标签: php laravel

我制作了一个让我犯错的函数:

  

Call to undefined method Illuminate\Database\Eloquent\Collection::save()

我无法理解为什么会抛出

public function multiplelinkPlayerWithFamily($parent_id)
{
    $player_id = Input::get('player_id');
    $CheckRelationship = UsersRelationship::where('parent_user_id', $parent_id)->where('child_user_id', $player_id)->first();

    if($CheckRelationship) {
        return Response::json( [
            'ok'=> false,
            'message'=> 'The profiles are currently linked '
        ] ,422);
    }

    $user = User::find($player_id);

    $user->parent_id = $parent_id;
    $user->updated_by = $parent_id;

    $user->save();

    $UsersRelationship = new UsersRelationship;

    $UsersRelationship->parent_user_id = $parent_id;
    $UsersRelationship->child_user_id = $player_id;

    $UsersRelationship->save();

    $udata = ApiUserController::getLoginUserData();

    return Response::json([
        'ok'=> true,
        'message'=> 'Linked',
        'udata'=> $udata
    ] ,200);
}

2 个答案:

答案 0 :(得分:0)

我无法看到你的模型是如何构建的,但看起来你实际上已经将模型转化为关系:即。 $UsersRelationship 您似乎正在尝试在用户之间建立多对多关系,对吗?

public function parents()
{
    return $this->belongsToMany('User','users_relationships','child_id','parent_id');
}

 public function children()
 {
    return $this->belongsToMany('User','users_relationships','parent_id','child_id');
 }

如果你的关系设置正确,你可以致电:

$user->parents()->attach($parent_id);

答案 1 :(得分:0)

Eloquent返回的所有多结果集(通过get方法或关系)都将返回一个集合对象。如果查询结果可能返回多个值,则Laravel将返回一个集合。了解返回Collection的查询方法可以避免在Collection上调用Eloquent模型方法的问题。

您的查询最有可能从数据库返回多条记录,或者从数据库返回任何记录。即使找到的记录数为1,这也会导致'Eloquent'返回Collection。因为返回的值是Collection,所以我们需要遍历返回的集合才能访问单个Model。

请尝试替换以下代码:

$user = User::find($player_id);

$user->parent_id = $parent_id;
$user->updated_by = $parent_id;
$user->save();

并将其替换为如下所示:

$user = User::find($player_id);
$user->each(function($user)
{
    $user->parent_id = $parent_id;
    $user->updated_by = $parent_id;
    $user->save();
});

希望它可以奏效。