我正在寻找一种方法将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系统,因此普通的旧PHP对象(例如MyUser)最有意义。
答案 0 :(得分:5)
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',$name), $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没有更多联系。
答案 1 :(得分:0)
我还希望为这个预定义的课程定制课程"用户"。
class User extends Model implements UserInterface, RemindableInterface {
到UserModel类:
class UserModel extends Model implements UserInterface, RemindableInterface {
所以不是黑客攻击代码和类,实际上有配置它。
打开app / config / auth.php
确保更改:
'model' => 'UserModel', // change to UserModel or your custom named class
'table' => 'User', // change if your table is non default "User"
去吧应该不错。
:)
答案 2 :(得分:0)
对于Eloquent模型,您可能希望利用->toArray()
方法然后使用(object)
对其进行类型转换以获取POPO。
e.g。
$user = (object) User::find(1)->toArray();
print_r($user);
你应该得到:
stdClass Object
(
[id] => 1
[name] => John Doe
[email] => fakeuser0@mail.com
[active] => 1
...
[created_at] => 2017-10-26 17:45:53
[updated_at] => 2017-10-26 17:45:53
[deleted_at] =>
)