如何在Laravel中把数据从一个表中复制到另一个表中,但不包括id?

问题描述 投票:1回答:1

我使用Laravel 6.x, 我需要把数据从一个表复制到另一个表. 像往常一样, 两个表都有很多列, 我在寻找一个不依赖列名的解决方案. 在未来,也许列名会被改变,我不想每次改变都触及这部分软件。

我想做这样的事情。

INSERT INTO product_copys (SELECT * from products);

我想复制所有的列 id 来自 products 表。

我用的是 ProductProductCopy 模型来处理这些数据.

在Laravel, Eloquent中有什么方便的解决方案吗?

php laravel eloquent laravel-6
1个回答
0
投票

你可以使用以下方法

在你的 App\Product 型号

class Product extends Model
{

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

然后在您的控制器中

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

ProductCopy::insert($copy);

如果你需要处理大量(数千条)Eloquent记录,使用chunk命令可以让你在不占用所有RAM的情况下完成。

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

https:/laravel.comdocs7.xeloquent#chunkingresults


0
投票

我找到了一个解决方法,可以在没有 id 栏目 拉威尔技巧). 以下是代码 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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.