Laravel - Best Practice Update и Save Record в базу данных с использованием массива объектов - PullRequest
0 голосов
/ 11 марта 2019

Я хочу спросить о наилучшей практике, как вы, ребята, делаете при сохранении и обновлении данных в базе данных, используя массив объектов.

Например, у меня есть этот AoJ:

[
    {
        package_id: 1, 
        posts: [
            {id: 1, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "Post 1", price: 3000}
            {id: 2, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "Post 2", price: 3000}
            {id: 3, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "post 3", price: 3000}
            {id: 4, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "post 4", price: 3000}
        ]
    }
];

Для каждого массива я создам новую строку в базе данных с новым идентификатором.

Вот что я хочу

Как обновить данные, если я хочу удалить id 3? Как лучше всего определить, что какая-то запись должна быть удалена из пакета?

На данный момент мое решение:

[
    {
        package_id: 1, 
        posts: [
            {id: 1, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "Post 1", price: 3000, remove: false}
            {id: 2, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "Post 2", price: 3000, remove: false}
            {id: 3, post_id: "1d1479c6-c114-46d5-becd-e4715c14e57d", name: "post 3", price: 3000, remove: true}
            {id: 4, post_id: "84f37e37-d050-4efd-bd08-811ab893959f", name: "post 4", price: 3000, remove: false}
        ]
    }
];

Поэтому при обновлении package_id 1 публикует сообщения, когда он видит remove: true, он удаляет его.

Что вы, ребята, думаете? Любое предложение, чтобы сделать его более простым?

NB. Я не могу удалить все и опубликовать новый метод. потому что каждое сообщение package_id имеет отношение к другой таблице

1 Ответ

1 голос
/ 11 марта 2019

Как мы уже говорили, позвольте мне опубликовать базовое решение для него.

У нас есть одна модель Post, такая как

class Post extends Model{}

, другая модель пакета

class Package extends Model{}

если у обоих есть первичный ключ 'id',

сводная таблица, описывающая отношения многих ко многим между ними, будет

package_id, комбинированный post_id как составной первичный ключ, что-то вроде

Schema::create('package_post', function (Blueprint $table) {
            $table->unsignedInteger('package_id');
            $table->unsignedInteger('post_id');

            $table->foreign('package_id')->references('id')->on('packages')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('post_id')->references('id')->on('posts')
                ->onUpdate('cascade')->onDelete('cascade');

            $table->primary(['package_id', 'post_id']);
        }); 

В зависимости от требования могут быть некоторые другие столбцы.

Отношения будут выглядеть как

class Package extends Model { 

 public function posts()
    {
        return $this->belongsToMany( Post::class, 'package_post', 'package_id', 'post_id');
    }
}

и

 class Post extends Model { 

     public function packages()
        {
            return $this->belongsToMany( Package::class, 'package_post', 'post_id', 'package_id');
        }
    }

Теперь, когда вычтобы получить или отредактировать или удалить его, вы можете использовать методы attach, detach и т. д.

Для получения, если пакет id = 1 и вы хотите получить все сообщения, принадлежащие этому пакету, вы можете просто получитьэто как

$posts= Package::find(1)->posts;

Для вставки вы можете использовать

$package->posts()->attach($post->id);

Для обновления

$package->posts()->sync([$post_id]);

, если вы хотите изменить post_id 1 на 2

$package->posts()->wherePivot('post_id', 1)->sync(2);

Для отсоединения

$package->posts()->detach($post_id);

Чтобы проверить, существует ли связь

$package->posts->contains($post_id)
...