Menu

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);

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~