我使用Laravel 6.x, 我需要把数据从一个表复制到另一个表. 像往常一样, 两个表都有很多列, 我在寻找一个不依赖列名的解决方案. 在未来,也许列名会被改变,我不想每次改变都触及这部分软件。
我想做这样的事情。
INSERT INTO product_copys (SELECT * from products);
我想复制所有的列 橆 的 id
来自 products
表。
我用的是 Product
和 ProductCopy
模型来处理这些数据.
在Laravel, Eloquent中有什么方便的解决方案吗?
你可以使用以下方法
在你的 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());
});
我找到了一个解决方法,可以在没有 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;
}