【问题标题】:Check if column exist in Laravel model's table and then apply condition检查 Laravel 模型表中是否存在列,然后应用条件
【发布时间】:2019-01-13 03:54:11
【问题描述】:

现状:我们正在为新注册创建新数据库。

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

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

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

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

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


感谢您的宝贵时间和建议。

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

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

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

    还有getColumnListinghasColumn

    【讨论】:

    • 哇,你有一个想法。
    • 我知道它并不完整,但对我帮助很大。现在我可以使用in_array('col_name',$columns)
    • @DigitalDrifter Call to undefined method Doctrine\DBAL\Schema\MySQLSchemaManager::getColumns()
    【解决方案2】:

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

    【讨论】:

    • @pankajkumar:Dhanbad,我的意思是 Dhanyawad :)
    • 哈哈哈,Dhanbad 没有错。我来自 Dhanbad-Jharkhand。 Nikesh Ji,我想加入你。请发送您的邮件或 Wtsup 以获取技术共享。我正在研究 Laravel 中的多供应商身份验证概念。所以我想你可以帮助我。该模型已经开发并在项目中使用。但在想改进这一点。所以我说。在 p1608088@gmail.com 中发送您的邮件。 @Niklesh 你来自哪里?
    【解决方案3】:

    在 5.8 中更新的解决方案

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

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

    【讨论】:

    • 这个对我有用,无需导入任何东西。
    【解决方案4】:

    这里晚了,但一个简单快捷的解决方案

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

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2015-08-09
      • 2014-07-17
      • 2021-07-18
      • 2013-05-19
      • 1970-01-01
      • 2016-11-30
      • 2019-06-08
      • 1970-01-01
      相关资源
      最近更新 更多