什麼叫ORM
ORM,全稱 Object-Relational Mapping(物件關係對映),它的作用是在關係型資料庫和業務實體物件之間作一個對映,這樣,我們在操作具體的業務物件時,就不需要再去和複雜的SQL語句打交道,只需簡單的操作物件的屬性和方法即可。
ORM 實現方式
兩種最常見的實現方式是 ActiveRecord 和 DataMapper (laravel 中使用的是前者)
我們先來理解兩個魔法函式 __call() 和 __callStatic()
class Test{
//動態呼叫的時候 沒有找到此函式 則執行__call() 方法
public function __call($method, $parameters){
echo 22222222222;
return (new Rest)->$method(...$parameters);
}
//靜態呼叫的時候 沒有找到此函式 則執行__callStatic()方法
public static function __callStatic($method, $parameters){
echo 1111111111;
return (new static)->$method(...$parameters);
}
}
class Rest{
public function foo($name , $age){
echo 333;
dump($name,$age);
}
}
//先呼叫了__callStatic(), 在呼叫__call(), 然後呼叫 foo();
Test::foo('張三',17);
//只呼叫了 __call(), 然後呼叫 foo();
(new Test())->foo('李四',16);die;
理解了前面兩個魔法函式 對於laravel Eloqument ORM 中的難點 也就理解了,我們來看一下Model中的原始碼
/**
* Handle dynamic method calls into the model. * * @param string $method
* @param array $parameters
* @return mixed
*/public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
return $this->newQuery()->$method(...$parameters);
}
/**
* Handle dynamic static method calls into the method. * * @param string $method
* @param array $parameters
* @return mixed
*/public static function __callStatic($method, $parameters)
{
return (new static)->$method(...$parameters);
}
new static 返回的是呼叫者的例項, new self() 返回的是自身例項
使用eloqument 查詢的時候
$list = Politician::where('party_id', 1)->count();
where 方法不在 Model中 會先執行callStatic()函式 獲取 App\Models\Politician 例項 ,再執行 call() , 在$this->newQuery() 返回例項中尋找where() count()等方法。
細看一下 newQuery() 方法 這裡面返回的例項。 理解了這兩個魔術函式 對laravel 中 orm的實現的難點就攻克了。
laravel 中的查詢構造器
$list = DB::table('categoty')->get();
Eloquent ORM 實際上是對 查詢構造進行了一次封裝,可以更方便的去操作。 查詢構造器的原始碼大家有興趣的話可以看一看,謝謝。
本作品採用《CC 協議》,轉載必須註明作者和本文連結