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

我正在使用 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;

    }

}


元芳怎么了
浏览 129回答 1
1回答

婷婷同学_

最后我找到了解决方案。在每个包装类中,我使用动态属性来获取关系集合,除了强加额外的查询外,这会导致延迟加载。因此,在将模型集合传递给每个包装器之前,检索必要的关系模型,每个包装器首先使用方法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;    }}并且,类似的功能用于其他包装器。
打开App,查看更多内容
随时随地看视频慕课网APP