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

8yparm6h  于 2023-04-22  发布在  其他
关注(0)|答案(6)|浏览(132)

目前情况:我们正在为新注册创建新数据库。
问题:如果在数据库迁移中做了任何更改,我们需要为以前创建的数据库处理它。或者为每个以前创建的数据库运行该迁移。

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

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

目前,我需要首先对第一行执行两个查询,检查该列是否存在,然后在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();
}

有没有什么方法可以在一次查询中实现。或者有没有更好的方法可以做到呢?

  • 感谢您的时间和建议 *
jbose2ul

jbose2ul1#

这里很晚,但一个简单而快速的解决方案

if (Schema::hasColumn('flights', 'departure_time')){
        // do something
      }
oug3syen

oug3syen2#

@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();
1dkrff03

1dkrff033#

更新了在5.8中运行的解决方案

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

这个解决方案只需要一个$object和一个'column_name'就可以工作。连接和表名都是从对象本身派生的。

oo7oh9g9

oo7oh9g94#

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

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

还有getColumnListing和hasColumn。

pzfprimi

pzfprimi5#

如果所有列都设置在fillablehidden属性中,则可以使用fillablehidden属性来完成此操作。

in_array(
   $column,
   array_merge($model->getFillable(), $model->getHidden()),
);

它为我工作✔️

dgsult0t

dgsult0t6#

还有一种方法很短,并且可以很好地与多个连接一起使用(因为您直接从模型中获取):

isset($model->attributesToArray()['column'])

相关问题