Laravel无法同步多对多的关系

时间:2014-11-17 17:04:57

标签: php database laravel relational-database eloquent

我正在尝试保存到我的数据库,并且作为该保存的一部分,我正在尝试同步我的多对多关系,但是我从我的API中收到以下错误,

"BadMethodCallException","message":"Call to undefined method Illuminate\\Database\\Query\\Builder::sync()"

我原本以为这是因为我在模型中的关系并不多,所以无法同步,但看起来对我来说是正确的,

class Organisation extends Eloquent {

//Organsiation __has_many__ users (members)
public function users()
{
    return $this->belongsToMany('User')->withPivot('is_admin');
}

//Organisation __has_many__ clients
public function clients()
{
    return $this->belongsToMany('Client');
}

//Organisation __has_many__ teams
public function teams()
{
    return $this->belongsToMany('Team');
}

//Organisation __has_many__ projects
public function projects()
{
    return $this->hasMany('Project');
}

}

class User extends Eloquent implements UserInterface, RemindableInterface {

use UserTrait, RemindableTrait;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'users';

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = array('password', 'remember_token');

public function organisations()
{
    return $this->belongsToMany('Organisation')->withPivot('is_admin');
}

}

我在成功保存后运行同步,

if(isset($members)) {
    $organisation->users()->sync($members);
}

成员肯定定了。组织化以下列方式创建,

public function create()
{
    //
    $postData = Input::all();

    $rules = array(
        'name' => 'required',
    );  

    $validation = Validator::make(Input::all(), $rules);

    if($validation->fails()) {

        return Response::json( $validation->messages()->first(), 500);

    } else {

        $organisation = new Organisation;

        // Save the basic organistion data.
        $organisation->name = $postData['name'];
        $organisation->information = $postData['information'];
        $organisation->type = 'organisation';

        /*
        * Create an array of users that can used for syncinng the many-to-many relationship
        * Loop the array to assign admins to the organisation also.
        */
        if(isset($postData['members'])) {

            $members = array();

            foreach($postData['members'] as $member) {
                if(isset($postData['admin'][$member['id']]) && $postData['admin'][$member['id']] == "on") {
                    $members[$member['id']] = array(
                        'is_admin' => 1
                    );
                } else {
                    $members[$member['id']] = array(
                        'is_admin' => 0
                    );
                }
            }

        }

        /*
        * Create an array of clients so we can sync the relationship easily
        *
        */
        if(isset($postData['clients'])) {

            $clients = array();
            foreach($postData['clients'] as $client) {
                $clients[] = $client['id'];
            }

        }

        /*
        * Create an array of teams so we can sync the relationship easily
        *
        */

        if(isset($postData['teams'])) {

            $teams = array();

            foreach($postData['teams'] as $team) {
                $teams[] = $team['id'];
            }

        }

        /*
        * Create an array of projects so we can sync the relationship easily
        *
        */
        if(isset($postData['projects'])) {

            $projects = array();

            foreach($postData['projects'] as $project) {
                $projects[] = $project['id'];
            }
        }


        if( $organisation->save() ) {

            if(isset($members)) {
                $organisation->users()->sync($members);
            }

            if(isset($teams)) {
                $organisation->teams()->sync($teams);
            }

            if(isset($teams)) {
                $organisation->clients()->sync($clients);
            }

            if(isset($projects)) {
                $organisation->projects()->sync($projects);
            }

            $organisation->load('users');
            $organisation->load('teams');
            $organisation->load('clients');
            $organisation->load('projects');

            return Response::make($organisation, 200);

        } else {

            return Response::make("Something has gone wrong", 500);

        }



    }

}

1 个答案:

答案 0 :(得分:0)

我正在寻找一段时间来解决这个问题而且我没有看到任何问题(我按照你的建议先看sync)但是我又看了一眼,我认为这个问题不是在这里同步用户。可能问题是:

if(isset($projects)) {
   $organisation->projects()->sync($projects);
}

您尝试在1对多关系中使用sync,因为您是这样定义的:

return $this->hasMany('Project');

所以要么将hasMany改为belongsToMany,如果是多对多关系(可能就是这种情况),或者不要在sync使用$projects,因为它有效只是为了多对多的关系。