当前情况:我们正在创建用于新注册的新数据库。
问题:如果数据库迁移发生任何更改,我们需要为以前创建的数据库处理。或为每个先前创建的数据库运行该迁移。
如果我们为每个数据库运行迁移都没有问题。
问题:如何检查数据库表中有我们要在查询中应用条件的列。
当前,我需要首先针对第一行触发两个查询,并检查该列的存在,然后在where子句中应用条件。像下面一样
@GetMapping("s3/batch/upload/base64")
public void uploadBase64ToWebp() {
List<File> fileList = new ArrayList<>();
String rawData = "1";
String base64Data = Base64.encodeBase64String(rawData.getBytes(StandardCharsets.UTF_8));
byte[] data = getBinaryImageData(base64Data);
File file = new File("1234.webp");
try {
FileUtils.writeByteArrayToFile(file, data);
} catch (IOException e) {
System.out.println(e);
}
fileList.add(file);
ObjectMetadataProvider metadataProvider = new ObjectMetadataProvider() {
public void provideObjectMetadata(File file, ObjectMetadata metadata) {
metadata.setContentType("image/webp");
metadata.getUserMetadata().put("filename", file.getPath());
metadata.getUserMetadata().put("createDateTime", new Date().toString());
}
};
TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(amazonS3).build();
transferManager.uploadFileList(bucketName, "school/transactions", new File("."), fileList, metadataProvider);
}
private byte[] getBinaryImageData(String image) {
return Base64.decodeBase64(
image
.replace("data:image/webp;base64,", "")
.getBytes(StandardCharsets.UTF_8)
);
}
在一个查询中有什么方法可以实现。还是更好的方法呢?
感谢您的时间和建议。
答案 0 :(得分:4)
您可以执行以下操作以获取Column类的数组:
$columns = $model->getConnection()->getDoctrineSchemaManager()->getColumns();
答案 1 :(得分:4)
@DigitalDrifter提出了使用Schema
类的想法,所以我就这样尝试了
我包含Schema
类
use Illuminate\Support\Facades\Schema;
然后使用Schema
类检查列,它也可以
$isColExist = Schema::connection("connection_name")->hasColumn('table_name','is_splited');
$q = Acquire::with("block");
if($isColExist){
$q->where('is_splited',0);
}
$records = $q->get();
答案 2 :(得分:0)
已更新的解决方案可以在5.8中运行
if ($object->getConnection()
->getSchemaBuilder()
->hasColumn($object->getTable(), 'column_name')) {
// required update here
}
此解决方案只需要$ object和'column_name'即可工作。连接和表名是从对象本身派生的。
答案 3 :(得分:0)
这里晚了,但是简单又快速的解决方案
if (Schema::hasColumn('flights', 'departure_time')){
// do something
}