Php Laravel5.6雄辩地试图更新不存在的专栏,但没有人要求它更新。(多对多关系)
我正在尝试在Laravel5.6应用程序中实现多对多关系,使用雄辩的ORM。我有与同名数据库表相对应的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
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*fromcustomers
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你解决了你的问题吗?如果是,问题是什么?我很好奇。