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 宽度设置为“*”?

XAML ColumnDefinition 中的 *(星号)是啥意思?

WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪