Как обновить базу данных ключ/значение с помощью laravel?

Я только изучаю ларавель. Я хочу обновить ключ/значение в базе данных с помощью 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);
}

Структура таблицы

Параметр API

Я пробовал с update и updateOrcreate и updateOrInsert и upsert методами.

просто в методе upsert написана база данных, но вставлены новые данные. Не обновлены.

Поместите уникальный ключ в свою таблицу метаданных — $table->unique(['product_id', 'key']).

ceejayoz 29.01.2023 19:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
1
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем случае вы должны использовать 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 не работает для меня в красноречивом, потому что вместо обновления вставлены данные.

Reza Heydari 30.01.2023 09:45

Я все еще думаю, что это работает для вас, и добавлю больше деталей кода в мой ответ, просто обратите внимание, что вы пытаетесь использовать метод upsert с несколькими строками вместо метода updateOrCreate с одной строкой.

Charlie 30.01.2023 12:14
Ответ принят как подходящий

моя проблема решилась так:


    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 И многие ко многим с содержанием.

Другие вопросы по теме