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;

    // 获取表名,如果没有定义,将类名转换为复数形式后,在转换为「蛇式」命名,设置表名
    // 例如 User 会转变为 users
    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 = $value;
    }


    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 网站上。

上一篇 下一篇
cxp1539
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
贡献者:3
讨论数量: 0
发起讨论 查看所有版本


暂无话题~