Laravel 中對 ORM 實現理解

xiaoqicheng發表於2020-07-08

什麼叫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 協議》,轉載必須註明作者和本文連結

相關文章