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
或从这些或其中任何一个使用的其他特征扩展来的任何其他类别。
这些功能在哪里定义?
可为空的方法本身不存在。如果您查看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)
有关更多信息__call:https : //www.php.net/manual/zh/language.oop5.overloading.php#object.call