检查Laravel模型的表中是否存在该列,然后应用条件

时间:2018-08-06 08:22:52

标签: php laravel laravel-5 eloquent

当前情况:我们正在创建用于新注册的新数据库。

问题:如果数据库迁移发生任何更改,我们需要为以前创建的数据库处理。或为每个先前创建的数据库运行该迁移。

如果我们为每个数据库运行迁移都没有问题。

问题:如何检查数据库表中有我们要在查询中应用条件的列。

当前,我需要首先针对第一行触发两个查询,并检查该列的存在,然后在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)
        );
    }

在一个查询中有什么方法可以实现。还是更好的方法呢?


感谢您的时间和建议。

4 个答案:

答案 0 :(得分:4)

您可以执行以下操作以获取Column类的数组:

$columns = $model->getConnection()->getDoctrineSchemaManager()->getColumns();

还有getColumnListinghasColumn

答案 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
      }