Model::create () 方法从哪里来的 ?

Model 类源码

namespace Illuminate\Database\Eloquent;

abstract class Model implements Arrayable, ArrayAccess, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
{
    // 省略 (●'◡'●)
}

通过 artisan make:model User 创建一个模型 ,创建的文件内容如下

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // 省略 ...
    public function demo()
    {
        // 使用 create() 方法插入一条新记录
        $this->create([
            'username' => 'test',
            'password' => '******'
        ]);
    }
}

可以看到创建的模型默认是继承 Illuminate\Database\Eloquent\Model ,然后可以通过 create() 方法来插入记录

但是打开 Model 类的源码看了一下 ,里面并没有 create() 及 update() 这些方法的实现 ,那这些方法是哪里来的呢 ?大概是我面向对象学的太渣了 ,实在想不出来 ~

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

没找到的方法一般都走php的魔术方法,一步一步找就会发现

先走下面的 __callStatic 方法,进行实例化 model 调用其动态方法。动态方法未找到就调用 __call 方法,根据逻辑走调用了 newQuery()方法,返回了 \Illuminate\Database\Eloquent\Builder 类,
最后调用了这个类的 create 方法

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    return $this->newQuery()->$method(...$parameters);
}

/**
 * Handle dynamic static method calls into the method.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}
4年前 评论
cangsongbayu (楼主) 4年前
qq332984152 3年前
讨论数量: 1

没找到的方法一般都走php的魔术方法,一步一步找就会发现

先走下面的 __callStatic 方法,进行实例化 model 调用其动态方法。动态方法未找到就调用 __call 方法,根据逻辑走调用了 newQuery()方法,返回了 \Illuminate\Database\Eloquent\Builder 类,
最后调用了这个类的 create 方法

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    return $this->newQuery()->$method(...$parameters);
}

/**
 * Handle dynamic static method calls into the method.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}
4年前 评论
cangsongbayu (楼主) 4年前
qq332984152 3年前

没找到的方法一般都走php的魔术方法,一步一步找就会发现

先走下面的 __callStatic 方法,进行实例化 model 调用其动态方法。动态方法未找到就调用 __call 方法,根据逻辑走调用了 newQuery()方法,返回了 \Illuminate\Database\Eloquent\Builder 类,
最后调用了这个类的 create 方法

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    return $this->newQuery()->$method(...$parameters);
}

/**
 * Handle dynamic static method calls into the method.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}
4年前 评论
cangsongbayu (楼主) 4年前
qq332984152 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!