Php Laravel5.6雄辩地试图更新不存在的专栏,但没有人要求它更新。(多对多关系)

Php Laravel5.6雄辩地试图更新不存在的专栏,但没有人要求它更新。(多对多关系),php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我正在尝试在Laravel5.6应用程序中实现多对多关系,使用雄辩的ORM。我有与同名数据库表相对应的Customer和CustomerGroup模型,以及透视表customers\u CustomerGroup。Laravel的文档中提供了与用户和角色相对相同的案例。customers\u customergroup表如下所示: +-------------+------------------+------------+------------+ | customer_id | custom

我正在尝试在Laravel5.6应用程序中实现多对多关系,使用雄辩的ORM。我有与同名数据库表相对应的
Customer
CustomerGroup
模型,以及透视表
customers\u CustomerGroup
。Laravel的文档中提供了与用户和角色相对相同的案例。
customers\u customergroup
表如下所示:

+-------------+------------------+------------+------------+
| 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
时,将
请求
对象作为数组传递给
update()
Eloquent方法,并且在相同的存储库方法中,我必须更新
customers\u customergroups
表,后者正常更新,但
Customer::find($id)->update($request->toArray())
引发异常:

SQLSTATE[42S22]:未找到列:“字段列表”中的1054未知列“组”

在传递给
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'
    ]);
}
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());
}
...
$this->repository->update($id, $request->all());
// or even better:                    ^^^^^^^^
$this->repository->update($id, $request->only('the', 'fields', 'that', 'you', 'expect'));
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
CustomerRepository.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'
    ]);
}
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());
}
...
$this->repository->update($id, $request->all());
// or even better:                    ^^^^^^^^
$this->repository->update($id, $request->only('the', 'fields', 'that', 'you', 'expect'));
//                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我认为问题与使用完整请求类有关,而不仅仅是获取有效负载。请尝试以下方法:

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'
    ]);
}
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());
}
...
$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']
    ]);
}
...
在我看来,您正在分离所有相关记录,以便将客户组重新附加到客户。这是一个很好的例子:


您能否
Log::info($request->toArray());
并签入
/storage/logs/
查看请求包含的内容?您能否在更新之前添加此内容,并向我们显示生成的SQL查询及其绑定?e:如果我包含代码,则会有所帮助:
\DB::listen(函数($query){dd($query->->-$query-$query->绑定);})
嗯,这很奇怪。你能发布完整的错误消息吗?除了查询之外,你还能发布更多的上下文,比如模型和控制器吗?@Dan奇怪的是,我没有看到任何插入或更新查询,它返回的只是一条SELECT语句。“SELECT*from
customers
where(
id
=?)limit 1”绑定:array:1[0=>“53211”]我更新了这个问题,在
update()
之前添加了缺少的
find($id)
方法。这可能相关吗?听起来很合理。但是,如果我从控制器传递整个请求对象(没有
->all()
)然后在存储库中的
Customer::find($id)->update($data->toArray())
中,我将其更改为
Customer::find($id)->update($data->except('group'))
自动将$data对象转换为数组,这有意义吗?因为它引发了相同的异常。是的,它是相同的。两种方法都应该返回检索到的数据的子集。这真的很奇怪,因为它试图保存关系组。你在
客户
对象中定义了它吗?你有应用程序吗结束模型中的关系?抱歉,我不明白您的意思!我是否已在我的
客户
对象中定义了什么?附加的
参数?否。此外,关系是在我的模型中的customerGroups()方法中定义的(我问题中的第二个代码块)对于检索来说效果很好。是的,我刚刚看到。我错过了。真的很奇怪。@EmilAvramov你解决了你的问题吗?如果是,问题是什么?我很好奇。