为了账号安全,请及时绑定邮箱和手机立即绑定

将雄辩的模型包装到另一个类会导致嵌套过多

将雄辩的模型包装到另一个类会导致嵌套过多

PHP
元芳怎么了 2022-12-30 17:03:04
我正在使用 Laravel 5.5。我写了一个包装器,它采用 Eloquent 模型并将其包装到一个Entity类中,每个模型都有自己的包装器。假设,用户有很多产品,一个产品属于一个用户。包装时,我需要获取用户的产品并将它们传递给产品包装器以将它们包装到产品实体中。在产品包装器中,我需要让该产品的用户所有者将其包装到用户实体。所以,再次,在用户包装器中,我需要用户产品!,这会创建一个无限循环。实体包装器:abstract class EntityWrapper{    protected $collection;    protected $entityClass;    public $entity;    public function __construct($collection)    {        $this->collection = $collection;        $this->entity = $this->buildEntity();    }    protected function buildEntity()    {        $tempEntity = new $this->entityClass;        $Entities = collect([]);        foreach ($this->collection as $model) {            $Entities->push($this->makeEntity($tempEntity, $model));        }        return $Entities;    }    abstract protected function makeEntity($entity, $model);}用户实体包装器:class UserEntityWrapper extends EntityWrapper{    protected $entityClass = UserEntity::class;    protected function makeEntity($userEntity, $model)    {        $userEntity->setId($model->user_id);        $userEntity->setName($model->name);        // set other properties of user entity...        //--------------- relations -----------------        $userEntity->setProducts((new ProductEntityWrapper($model->products))->entity);        return $userEntity;    }}产品实体包装器:class ProductEntityWrapper extends EntityWrapper{    protected $entityClass = ProductEntity::class;    protected function makeEntity($productEntity, $model)    {        $productEntity->setId($model->product_id);        $productEntity->setName($model->name);        // set other properties of product entity...        //--------------- relations -----------------        $productEntity->setUser((new UserEntityWrapper($model->user))->entity);        return $productEntity;    }}
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

最后我找到了解决方案。在每个包装类中,我使用动态属性来获取关系集合,除了强加额外的查询外,这会导致延迟加载。因此,在将模型集合传递给每个包装器之前,检索必要的关系模型,每个包装器首先使用方法getRelations()(返回可用关系数组)检查关系是否存在。如果预期关系可用,则将关系模型集合传递到适当的包装类中。


用户实体包装器:


class UserEntityWrapper extends EntityWrapper

{

    protected $entityClass = UserEntity::class;


    protected function makeEntity($userEntity, $model)

    {

        $userEntity->setId($model->user_id);

        $userEntity->setName($model->name);


        // set other properties of user entity...


        //--------------- relations -----------------

        $relations = $model->getRelations();


        $products = $relations['products'] ?? null;

        if ($products) {

            $userEntity->setProducts((new ProductEntityWrapper($products))->entity);

        }


        return $userEntity;

    }

}

并且,类似的功能用于其他包装器。


查看完整回答
反对 回复 2022-12-30
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号