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

Maj*_*nia 3 php oop laravel laravel-migrations

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

我想知道在哪里nullable()定义了类似的功能。我看不到public function nullable()laravel之类的东西。这必须在以下类之一中,但我找不到它:

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

或从这些或其中任何一个使用的其他特征扩展来的任何其他类别。

这些功能在哪里定义?

Chi*_*ung 5

可为空的方法本身不存在。如果您查看Blueprint该类,则该addColumn方法将返回的实例ColumnDefinition

并且ColumnDefinition是一个空类,仅扩展Fluent包含以下__call方法的类:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

因此,在执行时$table->string('name')->nullable();,它会进入,__call因为该nullable方法不存在,只是将nullable属性保存到true。这也转化为:

$this->attributes['nullable'] = true;
Run Code Online (Sandbox Code Playgroud)

然后在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';
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息__callhttps : //www.php.net/manual/zh/language.oop5.overloading.php#object.call