laravel ColumnDefinition 类中的方法在哪里实现?
Posted
技术标签:
【中文标题】laravel ColumnDefinition 类中的方法在哪里实现?【英文标题】:Where are the methods in laravel ColumnDefinition class implemented? 【发布时间】:2019-11-30 11:10:11 【问题描述】:要在 laravel 中编写迁移,我们有不同的方法将它们应用到我们的 $table
列。例如,其中之一是nullable()
,它使该列可以为空。
我想知道,像nullable()
这样的函数是在哪里定义的。我在 laravel 中看不到诸如 public function nullable()
之类的东西。这必须在这些类之一中,但我找不到它:
1)vendor\laravel\framework\src\Illuminate\Database\Schema\ColumnDefinition
2)vendor\laravel\framework\src\Illuminate\Support\Fluent
3)vendor\laravel\framework\src\Illuminate\Database\Schema\Blueprint
或从这些或其中之一中使用的任何其他特征扩展而来的任何其他类。
这些函数是在哪里定义的?
【问题讨论】:
【参考方案1】:可以为空的方法本身不存在。如果你看一下Blueprint
类,addColumn
方法会返回一个ColumnDefinition
的实例。
而ColumnDefinition
是一个空类,它只是扩展了包含以下__call
方法的Fluent
类:
/**
* Handle dynamic calls to the fluent instance to set attributes.
*
* @param string $method
* @param array $parameters
* @return $this
*/
public function __call($method, $parameters)
$this->attributes[$method] = count($parameters) > 0 ? $parameters[0] : true;
return $this;
因此,当您执行$table->string('name')->nullable();
时,它会进入__call
,因为nullable
方法不存在,只是将nullable
属性保存到true
。这也可以翻译为:
$this->attributes['nullable'] = true;
然后在mysqlGrammar
类中,它检查列是否可以为空:
/**
* Get the SQL for a nullable column modifier.
*
* @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column
* @return string|null
*/
protected function modifyNullable(Blueprint $blueprint, Fluent $column)
if (is_null($column->virtualAs) && is_null($column->storedAs))
return $column->nullable ? ' null' : ' not null';
更多关于__call
的信息:https://www.php.net/manual/en/language.oop5.overloading.php#object.call
【讨论】:
【参考方案2】:nullable
等修饰符函数因数据库驱动程序(或 laravel 中声明的语法)而异
你可以在vendor\laravel\framework\src\Illuminate\Database\Schema\Grammars\
找到你想要的
对于mysql,检查Illuminate\Database\Schema\Grammars\MySqlGrammar
【讨论】:
以上是关于laravel ColumnDefinition 类中的方法在哪里实现?的主要内容,如果未能解决你的问题,请参考以下文章
columnDefinition = "TEXT" 适用于所有类型的数据库
hsqldb 不支持列的 columnDefinition 属性
ListView DataTemplate 中的 ColumnDefinition 未扩展到全宽
如何以编程方式将 Silverlight Grid 布局 ColumnDefinition 宽度设置为“*”?