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 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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);
}
5年前 评论
cangsongbayu (楼主) 5年前
qq332984152 4年前
讨论数量: 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);
}
5年前 评论
cangsongbayu (楼主) 5年前
qq332984152 4年前

没找到的方法一般都走 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);
}
5年前 评论
cangsongbayu (楼主) 5年前
qq332984152 4年前