在 Laravel 中,通常使用 table 屬性來定義模型對應的表,例如:
class User extends Model { protected $table = 'users'; }
但是,我們可以使用子查詢,而不是直接對應到表。這種技術允許我們在應用程式層封裝複雜的查詢,就像建立資料庫視圖一樣,但增加了 Eloquent 操作的靈活性。
例如,考慮一個使用者表,它儲存有關管理員和普通使用者的資訊。我們可以使用子查詢來建立 AdminUser 模型:
class AdminUser { public function getTable(): string|\Illuminate\Contracts\Database\Query\Expression { $sql = User::query() ->select('id', 'name') ->where('admin_user', true) ->toRawSql(); return DB::raw(sprintf('(%s) as admin_users', $sql)); } }
此模型從子查詢中提取資料(從 admin_user = 1 的使用者中選擇 id、name),讓您像標準模型一樣查詢它:
AdminUser::query()->get();
或
AdminUser::query()->first();
但是,請注意某些查詢,例如 find(1),無法直接執行:
AdminUser::query()->find(1);
要解決此問題,您可以將 where 條件與 first() 結合使用:
AdminUser::query()->where('id', 1)->first();
提供的範例簡單說明了我們如何在模型中建立邏輯。然而,這種方法可以擴展和調整以適應更複雜的場景。透過利用這樣的結構,我們可以有效地管理和提取複雜的邏輯,確保我們的模型隨著複雜性的成長而保持組織性、可維護性和可擴展性。
以上是雄辯技巧:來自子查詢的 Laravel 模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!