Я пытаюсь отправить массив идентификаторов на сервер и сохранить их методом sync
, но он возвращает
SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'field list' (SQL: insert into `category_products` (`category_id`, `product_id`, `0`) values (0, 12, 2))
Код
product model
public function categories(){
return $this->belongsToMany(Category::class,'category_products', 'product_id', 'category_id');
}
category model
public function products(){
return $this->belongsToMany(Product::class);
}
controller store function
//getting other inputs...
$product->save();
$product->categories()->sync($request->categories, false);
data that sent to back-end
Примечание: вероятно, стоит упомянуть, что я использую vueJs для отправки данных, и он не основан на блейдах.
Component HTML
<el-cascader
v-model="form.categories"
style="width: 100%;"
:options="cats"
:props="{
multiple: true,
checkStrictly: true,
value: 'id',
label: 'name',
}"
clearable
filterable>
</el-cascader>
Component Script
data() {
return {
brands: [],
cats: [],
tags: [],
site_name: process.env.MIX_APP_NAME,
site_url: process.env.MIX_APP_URL,
dialogImageUrl: '',
dialogVisible: false,
disabled: false,
form: {
name: '',
slug: '',
price: '',
new_price: '',
sku: '',
qty: 1,
active: '',
photo: '',
photos: [],
shortDesc: '',
longDesc: '',
tags: [],
brand_id: '',
categories: [], // this will send to back-end
user_id: '',
seoTitle: '',
seoTags: '',
seoPhoto: '',
seoDescription: '',
variations: [],
options: [],
condition: '',
isbn: '',
ean: '',
upc: '',
},
}
},
methods: {
// send product data
onSubmit(e) {
e.preventDefault();
// axios.defaults.headers.common['Authorization'] = `Bearer ${await this.$auth.getAccessToken()}`
axios.post('/api/admin/products/store', this.form)
.then(res => {
console.log(res.data.success);
this.$notify({
title: 'Hooray!',
message: res.data.success,
offset: 100,
type: 'success'
});
// this.$router.push({name: 'adminProducts'});
this.form = {
name: "",
slug: "",
price: "",
new_price: "",
sku: "",
qty: '',
active: "",
photo: "",
shortDesc: "",
longDesc: "",
tags: [],
brand_id: "",
categories: [],
seoTitle: "",
seoTags: [],
seoPhoto: "",
seoDescription: "",
variations: [],
user_id: this.form.user_id
};
})
.catch(error => {
var errors = error.response.data;
let errorsHtml = '<ol>';
$.each(errors.errors,function (k,v) {
errorsHtml += '<li>'+ v + '</li>';
});
errorsHtml += '</ol>';
this.$notify.error({
title: 'Error',
dangerouslyUseHTMLString: true,
message: errorsHtml
});
})
},
}
Есть идеи?
Обновление
Я исправил проблему с этим кодом
foreach($request->categories as $caat){
$product->categories()->sync($caat, false);
}
теперь он сохраняет мои категории продуктов, но лично не доволен этим! Я хотел бы использовать метод syn c по умолчанию $product->categories()->sync($request->categories, false);
без циклических операций.
Пожалуйста, поделитесь своими идеями.