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';
}
实现步骤
- 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);