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';
}
实现步骤
- Article::find(1); 发现没有find方法就回去掉Model的__callStatic
- callStatic方法又回去调用call方法,这时发现有find方法
- find方法会调用where拼装要查询的参数,然后调用first()
- 因为first() 只需要取1条,所以设置$limit 1
- 最后组装sql
- 交给mysql 执行 返回结果。
Laravel中封装的比这个要复杂的多,这个只是让大家明白ORM简单的一个find()是怎么编写的
接下来我们可以去试着使用debug,来查看关联模型是怎么获取数据的,比如Article::with('comments')->get(10);
1 Comment
大神,想问问为什么上面调用find的时候他没有跑去__callStatic方法