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

2022-08-31 00:02:39

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

问题:如果在数据库迁移中进行了任何更改,我们需要为以前创建的数据库处理它。或者对以前创建的每个数据库运行该迁移。

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

:如何检查数据库表是否具有我们在查询中应用条件的列。

目前,我需要首先为第一行触发两个查询,并检查该列是否存在,然后在 where 子句中应用条件。如下图所示

$firstRow = Model::first();
if(isset($firstRow->is_splited)){
    $records = Model::where('is_splited',0)->get(); // this will give error if I don't check column existence for previously created database. 
}else{
    $records = Model::all();
}

有没有办法在一个查询中实现。或者任何更好的方法来做到这一点?


感谢您的时间和建议。


答案 1

@DigitalDrifter给出了一个使用类的想法,所以我只是像这样尝试Schema

I 包含类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

更新了在 5.8 中工作的解决方案

if ($object->getConnection()
           ->getSchemaBuilder()
           ->hasColumn($object->getTable(), 'column_name')) {
    // required update here
}

此解决方案只需要一个$object和一个“column_name”即可工作。连接和表名派生自对象本身。


推荐