Как скопировать данные из одной таблицы в другую со всеми столбцами, но не с идентификатором в Laravel? - PullRequest
1 голос
/ 29 мая 2020

Я использую Laravel 6.x, и мне нужно скопировать данные из одной таблицы в другую. Как обычно, в обеих таблицах много столбцов, и я ищу решение, не зависящее от имен столбцов. Возможно, в будущем столбцы будут изменены, и я не хочу касаться этой части программного обеспечения при каждом изменении.

Я хочу сделать что-то вроде этого:

INSERT INTO product_copys (SELECT * from products);

Я хочу скопируйте все столбцы без id из таблицы products.

Я использую модели Product и ProductCopy для обработки этих данных.

Есть ли любое удобное решение для этого в Laravel, Eloquent?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Я нашел способ получить столбцы без id столбца (спасибо Laravel Tricks ). Вот код для модели Product:

    /**
     * Get all columns of model
     *
     * @return Array
     */
    public static function getTableColumns() {
        $model = new Product();
        return $model->getConnection()
            ->getSchemaBuilder()
            ->getColumnListing($model->getTable());
    }

    /**
     * Return model's columns without given columns
     *
     * @param Array $without_columns
     * @return Array
     */
    public static function withoutColumn(Array $without_columns) {
        return array_diff(self::getTableColumns(), $without_columns);
    }

И здесь вы можете его использовать:

$columns = Product::withoutColumn(['id']);

Теперь нужно только запустить необработанный запрос SQL в контроллере:

    public function backup() {
        $columns = implode(',', Product::withoutColumn(['id']));

        DB::statement('INSERT INTO product_copys ('.$columns.', date_of_backup) (SELECT ' .
            $columns .', NOW() AS date_of_backup FROM products)');

        return Response::HTTP_OK;
    }
0 голосов
/ 29 мая 2020

Вы можете использовать следующие

В вашей App\Product модели

class Product extends Model
{

    protected $hidden = ['id'];
    //...
}

Затем в вашем контроллере

$copy = Product::all()->toArray();

ProductCopy::insert($copy);

Если вам нужно обработать множество (тысячи) записей Eloquent, использование команды chunk позволит вам обойтись без использования всей вашей оперативной памяти:

Product::chunk(200, function($products)
{
    ProductCopy::insert($products->toArray());
});

https://laravel.com/docs/7.x/eloquent#chunking -results

...