2014-12-16 6 views
2

Я бегу следующий код в одном из контроллеров Laravel,Laravel синхронизируется многие-ко-многим отношения

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

Однако я, кажется, получаю следующее сообщение об ошибке с сервера,

{ «error»: {«type»: «ErrorException», «message»: «preg_replace(): несоответствие параметров, шаблон - это строка, а замена - это массив», «файл»: «/ Users/S/Sites/app- api/vendor/laravel/framework/src/Illuminate/Support/helpers.php "," line ": 885}}

Я думаю, что он жалуется на форму того, что я отправляю на синхронизацию в качестве аргумента, это массив, который выглядит так, как я предполагаю, потому что я отправляю плохо отформатированный массив?

Для создания массива я отправляю к синхронизации I контура массива, который отправляется в 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)); 
    } 
} 

Я пытаюсь отправить массив, содержащий ключ, который является идентификатором членов, и то я хотел отправить некоторые данные в сводной таблице также, что поле is_admin и значение может быть либо 1 или 0.

Если я вернусь $members перед запуском синхронизации Laravel возвращает некоторые JSON, который выглядит, как это,

[ 
    { 
     "1":{"is_admin":1} 
    }, 
    { 
     "85":{"is_admin":0} 
    }, 
    { 
     "86":{"is_admin":0} 
    } 
] 

Это правильный формат? Я делаю что-то неправильно?

теперь я получаю новую ошибку,

Спасибо за это, я теперь получаю новую ошибку, вызов метода не определен Осветите \ Database \ Query \ Builder :: синхронизации()

ради ясности здесь мои отношения,

Организация

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 (нужно прокрутить бит вниз), то идентификатор должен быть ключом массива.Как так:

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']); 
} 
+0

Спасибо за это, я теперь получаю новую ошибку , – Udders

+0

И новая ошибка? Измените свой вопрос и добавьте сообщение об ошибке. – lukasgeiter

+0

Soory не разрешил мне редактировать комментарий после отправки отправки, вопрос был обновлен. – Udders