我正在尝试构建一个通过API更新产品的查询。该应用程序是在Angular2中构建的,包含在NodeJS层中。
产品与文件具有多对多关系。我想要发生的是,当数据被发送到API以更新文件时,Eloquent查询检查这种关系是否已经存在,如果不存在,它会在“file_product”表中添加关系。我有这个功能与类别多对多关系正常工作,但由于某种原因,这不适用于文件关系。这是我的代码:
产品控制器更新功能:
public function update(Request $request, $id)
{
if($id && is_numeric($id)) {
try {
$requestProductVars = $request->get('product');
$product = Product::find($id);
$product->title = $requestProductVars['title'];
$product->description = $requestProductVars['description'];
$product->images = json_encode($requestProductVars['images']);
$product->SKU = $requestProductVars['SKU'];
$product->manufacturer_id = $requestProductVars['manufacturer_id'];
$product->active = (($requestProductVars['active'] === true) ? '1' : '0');
if($request->get('categories')) {
$categories = $request->get('categories');
foreach($categories as $categoryId) {
$category = Category::find($categoryId);
if(!$product->categories->contains($category)) {
$product->categories()->save($category);
}
}
}
if(count($requestProductVars['files'])) {
$files = $requestProductVars['files'];
foreach($files as $file) {
$fileId = $file['id'];
$fileRecord = File::find($fileId);
if(!$product->files->contains($fileRecord)) {
$product->files()->save($fileRecord);
}
}
}
$product->save();
正如您所看到的,我检查请求是否有'files'属性,如果有循环遍历每个文件,请获取id并使用以下方法检查关系是否存在:
if(!$product->files->contains($fileRecord)) {
files属性包含一个File对象数组。
我的代码似乎停在这里,甚至似乎都没有执行。类别功能在这段代码中可以正常工作,虽然这很奇怪,但我在这里做的完全相同。
我检查了产品和文件的模型,这里定义了多对多关系:
Product.php
/**
* Returns all files associated with a product
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function files() {
return $this->belongsToMany('App\File')->withTimestamps();
}
File.php
/**
* Returns all products related to a file
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function products() {
return $this->belongsToMany('App\Product')->withTimestamps();
}
任何人都可以看到我的代码似乎无法正常工作的原因吗?
由于
答案 0 :(得分:0)
好的,我发现了问题所在。
在我将文件抽象到产品功能之前,我在产品表中有一个名为'files'的单元格。我忘记删除此单元格,这在我尝试查询文件关系时导致冲突。希望这可以帮助将来的某个人。