Php 在symfony 3.3中添加外部约束后获取奇怪数据

Php 在symfony 3.3中添加外部约束后获取奇怪数据,php,symfony,Php,Symfony,我的应用程序中有两个简单的实体:产品和类别,它们通过多通关系关联: <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Product * * @ORM\Table(name="product") * @ORM\Entity */ class Product { /**

我的应用程序中有两个简单的实体:产品类别,它们通过多通关系关联:

    <?php

    namespace AppBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
     * Product
     *
     * @ORM\Table(name="product")
     * @ORM\Entity
     */
    class Product
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;

        /**
         * @var string
         *
         * @ORM\Column(name="description", type="text")
         */
        private $description;

        /**
         * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
         * @ORM\KoinColumn(onDelete="CASCADE")
         */
        private $category;

        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }

        /**
         * Set name
         *
         * @param string $name
         *
         * @return Product
         */
        public function setName($name)
        {
            $this->name = $name;

            return $this;
        }

        /**
         * Get name
         *
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }

        /**
         * Set description
         *
         * @param string $description
         *
         * @return Product
         */
        public function setDescription($description)
        {
            $this->description = $description;

            return $this;
        }

        /**
         * Get description
         *
         * @return string
         */
        public function getDescription()
        {
            return $this->description;
        }

        /**
         * @return int
         */
        public function getCategory()
        {
            return $this->category;
        }

        /**
         * @param int $category
         */
        public function setCategory($category)
        {
            $this->category = $category;
        }
    }

/**
 * Category
 *
 * @ORM\Table(name="category")
 * @ORM\Entity
 */
class Category
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Category
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}
还有更多,这是不可能在这里完全呈现的。 如果有人建议我如何摆脱所有这些不必要的数据,只接收对象的属性,我将非常感激。
提前谢谢

之所以会出现这种情况,是因为默认情况下,条令将关联加载为对真实实体的引用的代理。然后,当您试图从该关联中获取数据时,Doctrine实际上从数据库中获取数据并将其水合物化。这通常被称为延迟加载,有助于提高性能

要解决此问题,您必须在关联上设置急取模式:

$qb = $repository->createQueryBuilder('p')->getQuery()->getArrayResult();

您可以使用查询生成器

use \Doctrine\Common\Util\Debug;
...
echo "<pre>";
Debug::dump($products);
...
要以数组形式获取结果,请为此使用Symfony序列化程序(或JMS序列化程序)

例如,您可以简单地将输出配置为实体的各种字段集(使用序列化组),隐藏一些字段并仅显示相关实体的ID

基本文件如下:


如果您想要比“print\r()”可读性更好的调试输出,可以使用

use\doctor\Common\Util\Debug;
...
回声“;
调试::转储($products);
...

在收集分类对象中的相关产品时,我也遇到一些问题。symfony的官方网站上有一个例子,比如收集数组中的所有产品,但这对我来说毫无意义。有什么问题?为什么它对您没有意义?首先,我无法想象它必须如何使用参数,其次,当我尝试复制并超越这些参数时,我的php storm不会为此生成getter和setter。但下面的示例中,它显示了如何接收数据:公共函数showProductsAction($categoryId){$category=$this->getDoctrine()->getRepository(Category::class)->find($categoryId);$products=$Category->getProducts();/…}您可以手动添加setter/getter。在你们写的例子中,你们得到了一个类别,然后是该类别的所有产品,这似乎是合乎逻辑的。非常感谢。现在一切都好了。
/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products", fetch="EAGER")
 */
private $category;
$qb = $repository->createQueryBuilder('p')->getQuery()->getArrayResult();
use \Doctrine\Common\Util\Debug;
...
echo "<pre>";
Debug::dump($products);
...