Я пытаюсь реализовать отношение «многие ко многим» в приложении Laravel 5.6, используя Eloquent ORM.У меня есть модели Customer
и CustomerGroup
, которые соответствуют одноименным таблицам базы данных и сводной таблице customers_customergroups
.Относительно идентичный случай представлен в документации Laravel с пользователями и ролями.Таблица customers_customergroups
выглядит следующим образом:
+-------------+------------------+------------+------------+
| customer_id | customergroup_id | created_at | updated_at |
+-------------+------------------+------------+------------+
| 53210 | 2 | -- | -- |
| 53210 | 4 | -- | -- |
| 53211 | 3 | -- | -- |
| 53211 | 4 | -- | -- |
+-------------+------------------+------------+------------+
Моя модель Customer
имеет метод с именем customerGroups()
, который извлекает все группы, к которым принадлежит клиент.
public function customerGroups()
{
return $this->belongsToMany('App\CustomerGroup', 'customers_customergroups', 'customer_id', 'customergroup_id');
}
Поиск работает нормально, но когда я пытаюсь обновить Customer
, передав объект Request
в виде массива в метод update()
Eloquent, и в том же методе хранилища я долженобновите таблицу customers_customergroups
, последняя обновляется нормально, но Customer::find($id)->update($request->toArray())
выдает исключение:
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'groups' в 'списке полей'....
Нет параметра с именем groups
в объекте Request, переданном в Customer::find($id)->update();
Что здесь происходит, почему выдается это исключение, что я делаюнеправильно, и как это сделать правильно?
Заранее спасибо!
Редактировать (публикация журнала, запрошенного в комментариях ниже) :
[2019-05-14 13:42:11] local.INFO: array (
'id' => 53211,
'name' => 'CUSTOMER ONE',
'surname' => NULL,
'Telephone' => '0123-4567890',
'email' => 'email@example.com',
'Street' => '22 BAKER STR.',
'City' => 'LONDON',
'Postal_code' => '1234',
'is_active' => '1',
'website' => '',
)
Редактировать (добавление кода, запрошенного HCK):
Customer.js
$scope.CreateCustomer = function(isValid) {
if (isValid)
{
PostData = {
'id': $scope.customer_id,
... all other parameters from the previous edit ...
}
if(($scope.izbraniGrupi).length > 0)
{
PostData.izbraniGrupi = $scope.groupsSelected;
}
$http({
method : 'PUT', // Laravel controller is a resource
url : 'customers',
data : PostData
}).then(function mySuccess(response) {
// Other stuff that happens on responseCode == 200.
});
};
CustomerController.php
// $this->repository is defined normally in __construct() and works as supposed to.
public function update(Request $request, $id)
{
try {
$this->repository->update($id, $request);
} catch(\Exception $e) {
return response()->json([
'message' => $e->getMessage()
]);
}
return response()->json([
'message' => 'Customer updated'
]);
}
CustomerRepository.php
public function update($id, $data)
{
if(isset($data['izbraniGrupi'])) {
DB::table('customers_customergroups')->where(['customer_id' => $id])->delete();
foreach ($data['izbraniGrupi'] as $group) {
DB::table('customers_customergroups')->insert([
'customer_id' => $id,
'customergroup_id' => $group['id']
]);
}
unset($data['izbraniGrupi']);
}
Customer::find($id)->update($data->toArray());
}