在 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 模型的详细内容,更多请关注至强加速其它相关文章!
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/35311.html