Laravel 同步多对多关系

3

我正在一个Laravel控制器中运行以下代码:

$organisation->users()->sync($members);

然而,我似乎从服务器得到了以下错误信息,内容如下:

{"error":{"type":"ErrorException","message":"preg_replace(): Parameter mismatch, pattern is a string while replacement is an array","file":"/Users/S/Sites/app-api/vendor/laravel/framework/src/Illuminate/Support/helpers.php","line":885}}

我认为它在抱怨我发送给同步作为参数的形式,这是一个看起来像这样的数组。我假设这是因为我发送了格式不正确的数组?

为了构建我发送到同步的数组,我循环遍历POST中发送的数组。
foreach($postData['members'] as $member) {
    if($member['admin'] == 1) {
        $members[] = array($member['id'] => array('is_admin' => 1));
    } else {
        $members[] = array($member['id'] => array('is_admin' => 0));
    }
}

我正在尝试发送一个包含成员ID的键的数组,然后我想要向数据透视表中发送一些数据,其中一个字段是 is_admin,其值可以是1或0。
如果在运行同步之前返回$members,laravel会返回一些类似于以下内容的JSON:
[
    {
        "1":{"is_admin":1}
    },
    {
        "85":{"is_admin":0}
    },
    {
        "86":{"is_admin":0}
    }
 ]

这是正确的格式吗?我做错了什么吗?

我现在遇到了一个新的错误,

谢谢你的帮助,但我现在遇到了一个新的错误:Illuminate\Database\Query\Builder::sync()方法未定义。

为了清晰起见,这里是我的关系:

组织

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

用户

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

我是否错误地认为多对多关系具有同步关系?

下面是完整的方法:

public function update($id)
{   
    //eturn Input::all('name');
    $postData = Input::all();
    $organisation = Organisation::find($id);

    if(!empty($postData['group_name'])) {
        $organisation->name = $postData['group_name'];
    } else {
        $organisation->name = $postData['name'];
    }

    $organisation->information = $postData['information'];
    $organisation->type = $postData['type'];
    $organisation->slug = $this->createSlug($postData['name']);
    //Sort out the members are they admins etc.
    if(isset($postData['members'])) {

        $members = array();

        foreach($postData['members'] as $member) {
            $members[$member['id']] = array('is_admin' => $member['admin']);
        }
    }

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

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

    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($clients)) {
            $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("success", 200);

    } else {

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

    }

}
1个回答

3

是的,你的数组结构有误。如果你查看文档(需要向下滚动一点),id应该是数组的键。像这样:

array(
    '1' => array('is_admin' => 1),
    '85' => array('is_admin' => 0),
    '86' => array('is_admin' => 0),
);

你可以通过进行一点修改来实现这个功能。
foreach($postData['members'] as $member) {
    if($member['admin'] == 1) {
        $members[$member['id']] = array('is_admin' => 1);
    } else {
        $members[$member['id']] = array('is_admin' => 0);
    }
}

同时,您可以将其写得更简单一些。

foreach($postData['members'] as $member) {
    $members[$member['id']] = array('is_admin' => $member['admin']);
}

很抱歉,发送后我无法编辑评论,问题已更新。 - Udders
关系看起来非常好。在您的“同步”调用之前,您可以发布代码吗? - lukasgeiter
我已经添加了整个方法。 - Udders
恐怕是,这个项目的特定部分涉及所有权和继承的复杂关系。 - Udders
但是你能通过注释掉直到错误消失的方式来验证它是哪一个吗? - lukasgeiter
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接