php – 如何将Laravel / Eloquent结果映射到自定义类
发布时间:2020-12-14 19:43:30 所属栏目:大数据 来源:网络整理
导读:我正在寻找一种方法将Laravel / Eloquent数据库查询的结果映射到自定义类,而不是默认的Eloquent类. Laravel / Eloquent是否包含任何内置设施?如果没有,是否有合适的地方“挂钩”到结果生成代码并进行必要的映射? 举个例子,这大致是我想要实现的目标: clas
我正在寻找一种方法将Laravel / Eloquent数据库查询的结果映射到自定义类,而不是默认的Eloquent类.
Laravel / Eloquent是否包含任何内置设施?如果没有,是否有合适的地方“挂钩”到结果生成代码并进行必要的映射? 举个例子,这大致是我想要实现的目标: class User extends Eloquent {} class MyUser { protected $name; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; return $this; } } $users = User::all(); // $users should now contain an array of MyUser instances 动机/问题的原因 这个问题背后的动机是找到一种方法,查询可以生成完全独立于框架的对象或对象数组.这是因为有问题的Laravel应用程序需要能够将其结果传递给其他非Laravel系统,因此Plain Old PHP对象(例如MyUser)最有意义. 解决方法
Laravel不会给你这样的东西,但是你可以用PHP做.将您的Eloquent User类注入您的自定义类,Laravel将自动为您注入.根据需要使用类中的对象,如果需要调用一个或另一个Eloquent方法,则可以只为Eloquent User对象提供回退.
一个很好的选择是使用存储库模式,您的类将期望接收存储库接口的实现,您必须: 为您的用户存储库创建接口,所有存储库(包括您的Eloquent模型)都必须实现此接口.这是一个允许您随时切换存储库实现的合同,而无需触及您的类.它还将使您的类框架不可知. interface UserRepositoryInterface { } 您的此存储库的实现可能是: class EloquentUser extends Eloquent implements UserRepositoryInterface { } class DoctrineUser extends DoctrineWhatever implements UserRepositoryInterface { } 创建你的课程 class User extends Eloquent {} class MyUser { protected $name; public function __construct(UserRepositoryInterface $user) { $this->userRepository = $user; } public function __call($name,$arguments) { return call_user_func_array(array($this->userRepository,$name),$arguments); } public static function __callStatic($name,$arguments) { return call_user_func_array(array('User',$arguments); } public function getName() { return $this->userRepository->name; } public function setName($name) { $this->name = $name; return $this; } } 现在在Laravel中选择你必须实现的实现 App::bind('UserRepositoryInterface','EloquentUser'); 要切换到学说,你只需要 App::bind('UserRepositoryInterface','DoctrineUser'); 如果你需要在Laravel之外使用这个类,你只需要实例化它,传递你想要的任何存储库实现: $user = new MyUser(new DoctrineUser); 与Laravel没有更多联系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |