laravel同步多对多关系 - php

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

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

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

{“ error”:{“ type”:“ ErrorException”,“ message”:“ preg_replace():参数不匹配,模式是字符串,而替换是数组”,“ file”:“ / Users / S / Sites / app -api / vendor / laravel / framework / src / Illuminate / Support / helpers.php“,” line“:885}}

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

要构建我发送到POST中发送的数组的sync 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。

如果在运行sync laravel之前返回$members,则返回一些如下所示的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);

    }

}

参考方案

是的,您的数组结构错误。如果您查看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']);
}

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…