有没有办法获取数据库表字段的数据类型? 几乎就像迁移的逆转。
例如,如果用户表列的迁移看起来像
...
$table->integer('age')
...
如果我指定表integer
和列user
,是否会返回age
的函数?
我对特定的数据库实现(mysql_field_type()
)不感兴趣。与Laravel的迁移一样,它需要与数据库无关。
答案 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)
$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'))
也许有帮助。