Eloquent ORM 中的 find 方法的实现流程


Eloquent ORM是什么?

Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。

简单例子


namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    //
}

Article::find(1);

模拟实现

这种是怎么实现的呢?我们来简单模拟下。跟实际上要差好多。


class Model{

    // 定义查询所需要的参数
    protected $wheres;
    protected $limit;
    protected $columns;

    // 获取表名,如果没有定义就在第一个字符小写,后面加个s
    public function getTable()
    {
        if (! isset($this->table)) {
            return str_replace(
                '\\', '', Str::snake(Str::plural(class_basename($this)))
            );
        }

        return $this->table;
    }

    // 根据上面的一些条件拼装sql;
    public function toSql()
    {
        // 这里实现步骤大家可以自己去拼写
        $sql = '';

        return $sql;
    }

    public function get($columns = ['*'])
    {
        $this->columns = $columns;

        // 执行mysql语句
        $results = mysql_query($this->toSql());

        return $results;
    }

    // 设置参数
    public function take($value)
    {
        return $this->limit = 1;
    }

    public function first($column)
    {
        return $this->take(1)->get($columns);
    }

    public function where($column, $operator = null, $value = null)
    {
        $this->wheres[] = compact(
            'type', 'column', 'operator', 'value'
        );

        return $this;
    }

    public function find($id, $columns = ['*'])
    {
        return $this->where($this->primaryKey, '=', $id)->first($columns);
    }

    public function __call($method, $parameters)
    {
        return $this->$method(...$parameters);
    }

    public static function __callStatic($method, $parameters)
    {
        return (new static)->$method(...$parameters);
    }
}

class Article extends Model
{
    protected $primaryKey = 'id';

}

实现步骤

  1. Article::find(1); 发现没有find方法就回去掉Model的__callStatic
  2. callStatic方法又回去调用call方法,这时发现有find方法
  3. find方法会调用where拼装要查询的参数,然后调用first()
  4. 因为first() 只需要取1条,所以设置$limit 1
  5. 最后组装sql
  6. 交给mysql 执行 返回结果。

Laravel中封装的比这个要复杂的多,这个只是让大家明白ORM简单的一个find()是怎么编写的

接下来我们可以去试着使用debug,来查看关联模型是怎么获取数据的,比如Article::with('comments')->get(10);


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: Laravel 事件之观察者模式

>> 下一篇: PHP 新特性 Trait 在 Laravel 中的应用