首页 文章

Laravel Eloquent模型属性

提问于
浏览
14

在实例化扩展Laravel的Eloquent Model类的模型类之后,有没有办法确定属性/属性是否映射到表,因此可以保存到表中?

例如,我有一个 announcements 表,列 idtext 和"created_by" .

我怎么知道 created_by 是一个属性,如果设置将被保存?

$announcement = new Announcement();

isset($announcement->created_by) 可以理解,如果我没有't explicitly set the value yet. I have tried various functions inherited from the Eloquent model class, but so far none have worked. I'我正在寻找类似的东西,则返回false:

$announcement->doesThisMapToMyTable('created_by') 无论是否已设置 $announcement->created_by ,都返回true .

5 回答

  • 6

    对于Laravel 5.4:

    $hasCreatedAt = \Schema::hasColumn(app(Model::class)->getTable(), 'created_at');
    
        if($hasCreatedAt == true) {
           ...
        }
    
  • 0

    如果您的模型充满了数据,您可以:

    $announcement = Announcement::find(1);
    
    $attributes = $announcement->getAttributes();
    
    isset($attributes['created_by']);
    

    对于空模型(新模型),遗憾的是,您必须使用小型黑客获取列 . 将此方法添加到BaseModel:

    <?php
    
    class BaseModel extends Eloquent {
    
        public function getAllColumnsNames()
        {
            switch (DB::connection()->getConfig('driver')) {
                case 'pgsql':
                    $query = "SELECT column_name FROM information_schema.columns WHERE table_name = '".$this->getTable()."'";
                    $column_name = 'column_name';
                    $reverse = true;
                    break;
    
                case 'mysql':
                    $query = 'SHOW COLUMNS FROM '.$this->getTable();
                    $column_name = 'Field';
                    $reverse = false;
                    break;
    
                case 'sqlsrv':
                    $parts = explode('.', $this->getTable());
                    $num = (count($parts) - 1);
                    $table = $parts[$num];
                    $query = "SELECT column_name FROM ".DB::connection()->getConfig('database').".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'".$table."'";
                    $column_name = 'column_name';
                    $reverse = false;
                    break;
    
                default: 
                    $error = 'Database driver not supported: '.DB::connection()->getConfig('driver');
                    throw new Exception($error);
                    break;
            }
    
            $columns = array();
    
            foreach(DB::select($query) as $column)
            {
                $columns[$column->$column_name] = $column->$column_name; // setting the column name as key too
            }
    
            if($reverse)
            {
                $columns = array_reverse($columns);
            }
    
            return $columns;
        }
    
    }
    

    从中扩展您的模型:

    class Announcement extends BaseModel {
    
    }
    

    然后你将能够:

    $columns = $announcement->getAllColumnsNames();
    
    isset($columns['created_by']);
    
  • 23

    您可以使用Schema facade查找列,而不是将自己的查找写入数据库内部:

    use Illuminate\Support\Facades\Schema;
    
    $announcement = new Announcement();
    $column_names = Schema::getColumnListing($announcement->getTable());
    if (isset($column_names['created_by'])) {
      // whatever you need
    }
    
  • 7

    Laravel 5.4

    我使用Leiths的答案来创建通用的辅助方法,它自动将JS-object映射到Laravel模型(并且基本上忽略那些不属于模型的属性,从而避免了未定义列的QueryBuilder错误消息) . 另外包含简单的createOrEdit -approach(即使没有“ID存在吗?” - 验证):

    public function store(Request $request) {
            if($request->input("club")) {
                $club = \App\Club::find($request->input("club")["id"]);
            } else {
                $club = new \App\Club;
            }
            $club = self::mapModel($request->input("club"), $club);
            $club->save();
        }
        
        public function mapModel($input,$model) {
            $columns = Schema::getColumnListing($model->getTable());
            foreach ($columns as $i => $key) {
                if($input[$key]) {
                    $model->{$key} = $input[$key];
                }
            }
            return $model;
        }
    
  • -1

    我曾经 !empty($announcement->created_by) 这对我来说很有用

相关问题