Laravel 5.6 Eloquent пытается обновить несуществующий столбец, когда никто не попросил об этом.(Отношение многие ко многим) - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь реализовать отношение «многие ко многим» в приложении 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());
}

1 Ответ

1 голос
/ 14 мая 2019

Я думаю, что проблема связана с использованием полного класса Request вместо простого получения полезной нагрузки. Попробуйте это:

CustomerController.php

...
$this->repository->update($id, $request->all());
// or even better:                    ^^^^^^^^
$this->repository->update($id, $request->only('the', 'fields', 'that', 'you', 'expect'));
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Не связано, но я заметил, что вы делаете это в вашем хранилище:

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

Мне кажется, что вы отключаете все связанные записи, чтобы повторно присоединить группы клиентов к клиентам . Это выглядит неплохо для Синхронизирующих ассоциаций :

Customer::find($id)->customerGroups()->sync(collect($data['izbraniGrupi'])->pluck('id'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...