如何在Laravel中获取数据库字段类型?

时间:2013-09-01 20:38:32

标签: php database laravel

有没有办法获取数据库表字段的数据类型? 几乎就像迁移的逆转。

例如,如果用户表列的迁移看起来像

...
$table->integer('age')
...

如果我指定表integer和列user,是否会返回age的函数?

我对特定的数据库实现(mysql_field_type())不感兴趣。与Laravel的迁移一样,它需要与数据库无关。

9 个答案:

答案 0 :(得分:28)

在Laravel挖掘之后,这就是我得到的。

DB::connection()->getDoctrineColumn('users', 'age')->getType()->getName()

答案 1 :(得分:6)

简答:是的,该功能存在

在搜索完代码后,我发现你可以。跳过下面的“解决方案”来查看它。

Eloquent和数据库类使用PDO,它不会绑定特定的基于SQL的数据库。

因此,您应该能够做到这样的事情:

$pdo = DB::getPdo();

请注意,连接对象可以return the instance of PDO

有一些方法,例如getColumnMeta,但并非所有驱动程序都支持它们

然而,一些谷歌搜索似乎指出最好的方法可能是使用ANSI-standard INFORMATION_SCHEMA - 使用SQL查询获取该信息。

解决方案

最后,Laravel将Doctrine库作为依赖项包含在内,其中包含一些schema functionality

  

旁注:实际上,Doctrine因其基于模式的功能而被包含在内--Laravel不使用Doctrine的ORM

在我们检索PDO实例的同一连接对象上查看here,我们可以获得doctrine连接和模式管理器。你应该可以打电话:

$schema = DB:: getDoctrineSchemaManager();

然后,您可以使用架构管理器(docs here)来获取您所追求的内容。

答案 2 :(得分:6)

获取表字段的所有详细信息

DB::select('describe table_name');

示例:-

DB::select('describe users');

响应将是这样

 Array
(
    [0] => stdClass Object
        (
            [Field] => id
            [Type] => int(11)
            [Null] => NO
            [Key] => PRI
            [Default] => 
            [Extra] => auto_increment
        )

    [1] => stdClass Object
        (
            [Field] => user_group_id
            [Type] => int(11) unsigned
            [Null] => YES
            [Key] => MUL
            [Default] => 
            [Extra] => 
        )

    [2] => stdClass Object
        (
            [Field] => username
            [Type] => varchar(100)
            [Null] => YES
            [Key] => MUL
            [Default] => 
            [Extra] => 
        )
 )

答案 3 :(得分:4)

对于Laravel 5.2 - 5.5+,请使用Builder::getColumnType()

class AttractionSpider(CrawlSpider):
name = "get-webcontent"
start_urls = [
    'http://quotes.toscrape.com/page/1/'
]
rules = ()
def create_dirs(dir):    
    if not os.path.exists(dir):
        os.makedirs(dir)
    else:
        shutil.rmtree(dir)           #removes all the subdirectories!
        os.makedirs(dir)

def __init__(self, name=None, **kwargs):
    super(AttractionSpider, self).__init__(name, **kwargs)
    self.items_buffer = {}
    self.base_url = "http://quotes.toscrape.com/page/1/"        
    from scrapy.conf import settings
    settings.overrides['DOWNLOAD_TIMEOUT'] = 360
def write_to_file(file_name, content_list):
    with open(file_name, 'wb') as fp:
        pickle.dump(content_list, fp)

def parse(self, response):
    print ("Start scrapping webcontent....")        
    try:            
        str = ""
        hxs = Selector(response)
        links = hxs.xpath('//li//@href').extract()
        with open('test1_href', 'wb') as fp:
            pickle.dump(links, fp)
        if not links:               
            return
            log.msg("No Data to scrap")
        for link in links:
            v_url = ''.join( link.extract() )           
            if not v_url:
                continue
            else:
                _url = self.base_url + v_url
    except Exception as e:
        log.msg("Parsing failed for URL {%s}"%format(response.request.url))
        raise 

def parse_details(self, response):
    print ("Start scrapping Detailed Info....")
    try:
        hxs = Selector(response)            
        yield l_venue
    except Exception as e:
        log.msg("Parsing failed for URL {%s}"%format(response.request.url))
        raise

答案 4 :(得分:3)

我在laravel 4.1中使用它,

$schema = \DB::getDoctrineSchemaManager();
$tables = $schema->listTables();

foreach ($tables as $table) {
    echo "<i>".$table->getName() . " </i><b>columns:</b><br>";
    foreach ($table->getColumns() as $column) {
        echo ' - ' . $column->getName() . " - " . $column->getType()->getName() . "<br>";
    }
}

或获取特定表格使用此:$columns = $schema->listTableColumns('user');

答案 5 :(得分:3)

Laravel 5+(包括6和7)中,您可以通过以下方式获取数据库表列的元数据(即类型,默认值等):

use Illuminate\Support\Facades\Schema;

对于所有列:

 $columns = Schema::getConnection()->getDoctrineSchemaManager()->listTableColumns('table_name');
 $column = Schema::getConnection()->getDoctrineColumn('table_name'', 'column_name'); //For a single column:

getDoctrineSchemaManager方法返回一个\Doctrine\DBAL\Schema\Column类实例的数组。

getDoctrineColumn方法返回\Doctrine\DBAL\Schema\Column类的实例。

来自\Doctrine\DBAL\Schema\Column类的方法:

$column->getName();
$column->getNotnull(); // returns true/false
$column->getDefault(); 
$column->getType(); 
$column->getLength();

答案 6 :(得分:0)

泛化:

DB::connection()->getDoctrineColumn($tableName, $colName)
    ->getType()
    ->getName();

适用于Laravel 5.3。

答案 7 :(得分:0)

在模型中:laravel5.x

    $temp = $this->newQuery()->fromQuery("SHOW FIELDS FROM ".$this->getTable());

    foreach($temp as $val){
       echo 'Field: '.$val->Field;
       echo 'Type: '.$val->Type;
   }

答案 8 :(得分:-1)

您可以尝试以下表达式:

DB::select(DB::raw('SHOW FIELDS FROM tablename'))

也许有帮助。