【问题标题】:Where are the methods in laravel ColumnDefinition class implemented?laravel ColumnDefinition 类中的方法在哪里实现?
【发布时间】: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

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

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

【问题讨论】:

    标签: php laravel oop laravel-migrations


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2013-11-22
        • 2021-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多