雄辩技巧:来自子查询的 Laravel 模型

WBOY
发布: 2024-08-17 06:50:06
原创
506 人浏览过

Eloquent Trick: Laravel Model from Subquery

在 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板