Я только изучаю ларавель. Я хочу обновить ключ/значение в базе данных с помощью laravel api, но не работает.
Моя модель products
— это один ко многим с ProductMeta
и многие ко многим с contents
моделью.
class Product extends Model
{
use HasFactory;
protected $guarded = [];
public function productMeta()
{
return $this->hasMany(ProductMeta::class);
}
public function content()
{
return $this->belongsToMany(Content::class, 'product_contents')->withTimestamps();
}
}
class ProductMeta extends Model
{
use HasFactory;
protected $guarded = [];
public function products()
{
return $this->belongsTo(Product::class);
}
}
class Content extends Model
{
use HasFactory;
protected $guarded= [];
public function product()
{
return $this->belongsToMany(Product::class, 'product_contents');
}
public function update(Request $request, $id)
{
$product = Product::findOrFail($id);
DB::table('product_metas')
->upsert(
[
[
'product_id' => $product->id,
'key' => 'name',
'value' => $request->name,
],
[
'product_id' => $product->id,
'key' => 'price',
'value' => $request->name,
],
[
'product_id' => $product->id,
'key' => 'amount',
'value' => $request->name,
],
],
['product_id','key'],
['value']
);
return \response()->json([], 204);
}
Я пробовал с update
и updateOrcreate
и updateOrInsert
и upsert
методами.
просто в методе upsert написана база данных, но вставлены новые данные. Не обновлены.
В вашем случае вы должны использовать updateOrCreate()
вместо upsert
.
Product::updateOrCreate([
'product_id' => $id,
'name' => $request->name,
'price' => $request->price,
'amount' => $request->amount
]);
или
Product::upsert([
[
'product_id' => $id,
'name' => $request->name,
'price' => $request->price,
'amount' => $request->amount
]
], ['product_id'], ['name', 'price', 'amount']);
Кроме того, ваша проблема заключается в том, что имя вашей таблицы не соответствует имени таблицы вашей структуры. В вашем контроллере DB::table('product_metas')
должно быть DB::table('products_meta')
.
Метод upsert не работает для меня в красноречивом, потому что вместо обновления вставлены данные.
Я все еще думаю, что это работает для вас, и добавлю больше деталей кода в мой ответ, просто обратите внимание, что вы пытаетесь использовать метод upsert с несколькими строками вместо метода updateOrCreate с одной строкой.
моя проблема решилась так:
ProductMeta::query()->where('product_id', $id)->upsert([
['product_id' => $id, 'key' => 'name', 'value' => $request->name],
['product_id' => $id, 'key' => 'price', 'value' => $request->price],
['product_id' => $id, 'key' => 'amount', 'value' => $request->amount]],
['product_id'], ['value']);
$contentRecord = Product::find($id);
$contentRecord->content()->update(['path'=>$request->path]);
return response()->json([], 204);
Я забыл использовать метод query() для ProductMeta и добавил $table->unique(['product_id', 'key']);
к переносу метаданных продукта.
** продукты относятся один ко многим с продуктом Meta И многие ко многим с содержанием.
Поместите уникальный ключ в свою таблицу метаданных —
$table->unique(['product_id', 'key'])
.