前幾天我們看完了 Laravel 裡面 SQL Query 的轉換方式
今天我們來看 ORM,或者說 Laravel Model 怎麼轉換成 SQL Query 的。
一個典型的 Laravel Model 存取方式通常像是這樣
User::find(1);
首先我們來看看 User
這個類別,這是一個官方提供的 Laravel Model
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
use Illuminate\Database\Eloquent\Model;
class User extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}
這邊的 Illuminate\Database\Eloquent\Model
才是實際上的 Model 物件,我們看看實作
abstract class Model implements Arrayable, ArrayAccess, CanBeEscapedWhenCastToString, HasBroadcastChannel, Jsonable, JsonSerializable, QueueableEntity, Stringable, UrlRoutable
{
use Concerns\HasAttributes,
Concerns\HasEvents,
Concerns\HasGlobalScopes,
Concerns\HasRelationships,
Concerns\HasTimestamps,
Concerns\HasUniqueIds,
Concerns\HidesAttributes,
Concerns\GuardsAttributes,
ForwardsCalls;
這邊我們可以發現,因為這段是 Laravel 資料庫串接非常核心的邏輯,有著複雜的功能,所以這邊實作了大量的介面,而不是用一個介面統整所有的功能。
另外為了讓類別內實作的功能清晰一點,這邊選擇的做法是使用許多的 trait,不是傳統建議的以合成取代繼承的方式。這件事情比較見仁見智一點,不過我個人比較喜歡 Laravel 的做法。
不過,即使這裡面有這麼多的函數,如果我們試著在裡面搜尋 find()
函數的話,是找不到對應的函數的。
這是怎麼回事呢?剩下的我們就留到明天再來聊囉!