laravel ColumnDefinition class 中的方法在哪里实现?

Where are the methods in laravel ColumnDefinition class implemented?

要在 laravel 中编写迁移,我们有不同的方法将它们应用到我们的 $table 列。例如,其中之一是 nullable(),它使该列可以为空。

我想知道,像nullable()这样的函数是在哪里定义的。我在 laravel 中看不到 public function nullable() 之类的内容。这必须在这些 classes 之一中,但我找不到它:

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

或任何其他 class 从这些或其中之一中使用的任何其他特征扩展。

这些函数是在哪里定义的?

nullable 等修饰符函数因数据库驱动程序(或 laravel 中声明的语法)而异

你可以在vendor\laravel\framework\src\Illuminate\Database\Schema\Grammars\

中找到你想要的

对于 mysql,检查 Illuminate\Database\Schema\Grammars\MySqlGrammar

可空方法本身不存在。如果你看一下 Blueprint class,addColumn 方法 returns ColumnDefinition.

的一个实例

ColumnDefinition 是一个空的 class,它只是扩展了包含以下 __call 方法的 Fluent class:

/**
 * 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属性保存到[=23] =].这也转化为:

$this->attributes['nullable'] = true;

然后在 MySqlGrammar class 中检查该列是否可为空:

/**
 * 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