laravel 同步多对多关系

Posted

技术标签:

【中文标题】laravel 同步多对多关系【英文标题】:laravel syncing many-to-many relationship 【发布时间】:2015-02-14 22:44:01 【问题描述】:

我在其中一个 laravel 控制器中运行以下代码,

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

但是我似乎从服务器收到以下错误,

"error":"type":"ErrorException","message":"preg_replace(): 参数不匹配,pattern是字符串而replacement是数组","file":"/Users/S/站点/app-api/vendor/laravel/framework/src/Illuminate/Support/helpers.php","line":885

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

要构建我发送到 POST 中发送的数组的同步 I 循环的数组,

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】:

是的,您的数组结构错误。如果您查看docs(需要向下滚动一点),则 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']);

【讨论】:

新的错误是?请编辑您的问题并添加错误消息? Soory 不允许我在点击发送后编辑评论,问题已更新。 关系看起来非常好。您可以在sync 通话之前发布代码吗? 我已经添加了整个方法。 我认为这是因为其他sync 电话之一。它们真的都是多对多的关系吗?

以上是关于laravel 同步多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新

Laravel 多列上的多对多同步()

Laravel 多对多同步与附加列

Laravel5.1 模型 --多对多关系

Laravel 上的多对多问题关系

Laravel 4:具有额外关系的多对多