如何使用查询生成器在 Symfony 4 中连接外部 ID 上的多个实体?

2023-12-04

我正在努力学习 Symfony。今天我正在关注关联教程。我决定制作一个小应用程序,包括房屋、厨房、卧室和橱柜。我(尝试;-))使用draw.io制作一个小的类图,以便为您提供更好的想法。

This is it

所以基本上一栋房子可以有多个卧室和多个厨房。每个厨房可以有多个橱柜。 House 有一个 id 和一个名称。卧室和厨房也是如此。柜子有 id、shopUrl,也通过外键链接(account_id) 到其父厨房。 我还使用外键将厨房和卧室链接到房子(house_id)。所以我按照教程创建了House entity:

    <?php

    namespace App\Entity;

    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\HouseRepository")
     */
    class House implements \JsonSerializable
    {

        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Kitchen", mappedBy="house")
         */
        private $kitchen;

        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Bedroom", mappedBy="house")
         */
        private $bedroom;    

        /**
         * House constructor
         */
        public function __construct()
        {
            $this->kitchen = new ArrayCollection();
            $this->bedroom = new ArrayCollection();
        }

        /**
         * @return Collection|Kitchen[]
         */
        public function getKitchen(): Collection
        {
            return $this->kitchen;
        }

        /**
         * @return Collection|Bedroom[]
         */
        public function getBedroom(): Collection
        {
            return $this->bedroom;
        }


        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;

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

        public function getId(): ?int
        {
            return $this->id;
        }

        public function getName(): ?string
        {
            return $this->name;
        }

        public function setName(string $name): self
        {
            $this->name = $name;

            return $this;
        }

        public function jsonSerialize()
        {
            return get_object_vars($this);
        }
    }

House 存储库是空的(又名:仅包含 Symfony 自动生成的代码):

    <?php

    namespace App\Repository;

    use App\Entity\House;
    use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use Symfony\Bridge\Doctrine\RegistryInterface;

    /**
     * @method House|null find($id, $lockMode = null, $lockVersion = null)
     * @method House|null findOneBy(array $criteria, array $orderBy = null)
     * @method House[]    findAll()
     * @method House[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
     */
    class HouseRepository extends ServiceEntityRepository
    {
        public function __construct(RegistryInterface $registry)
        {
            parent::__construct($registry, House::class);
        }

    }

The Bedroom实体是这样的:

    <?php

    namespace App\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\BedroomRepository")
     */
    class Bedroom implements \JsonSerializable
    {

        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\House", inversedBy="bedroom")
         */
        private $house;

        public function getHouse(): House
        {
            return $this->house;
        }

        public function setHouse(House $house): self
        {
            $this->house = $house;

            return $this;
        }


        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;

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

        public function getId(): ?int
        {
            return $this->id;
        }

        public function getName(): ?string
        {
            return $this->name;
        }

        public function setName(string $name): self
        {
            $this->name = $name;

            return $this;
        }

        public function jsonSerialize()
        {
            return get_object_vars($this);
        }
    }

卧室存储库也是空的。

The Kitchen实体有以下代码:

    <?php

    namespace App\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\KitchenRepository")
     */
    class Kitchen implements \JsonSerializable
    {


        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Cabinet", mappedBy="kitchen")
         */
        private $cabinet;

        /**
         * Kitchen constructor
         */
         public function __construct()
        {
            $this->cabinet= new ArrayCollection();
        }

        /**
         * @return Collection|Cabinet[]
         */
        public function getCabinet(): Collection
        {
            return $this->cabinet;
        }


        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\House", inversedBy="kitchen")
         */
        private $house;

        public function getHouse(): House
        {
            return $this->house;
        }

        public function setHouse(House $house): self
        {
            $this->house = $house;

            return $this;
        }

        /**
         * @ORM\Id()
         * @ORM\GeneratedValue(strategy="UUID")
         * @ORM\Column(type="integer")
         */
        private $id;

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

        public function getId(): int
        {
            return $this->id;
        }

        public function getName(): string
        {
            return $this->name;
        }

        public function setName(string $name): self
        {
            $this->name = $name;

            return $this;
        }

        public function jsonSerialize()
        {
            return get_object_vars($this);
        }
    }

厨房存储库也是空的。 最后,cabinet由以下部分组成:

    <?php

    namespace App\Entity;

    use DateTime;
    use Doctrine\ORM\Mapping as ORM;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\CabinetRepository")
     */
    class Cabinet
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;

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

        private $account_id;

        /**
         * @ORM\ManyToOne(targetEntity="Kitchen", inversedBy="cabinet")
         */
        private $kitchen;

        /**
         * Cabinet constructor.
         * @param string $shopUrl
         * @param Kitchen $kitchen
         * @param int $id
         */
        public function __construct(string $shopUrl, Kitchen $kitchen = null, int $id = null)
        {
            $this->shopUrl = $shopUrl;
            $this->kitchen = $kitchen;
            $this->id = $id;
        }

        public function setId(int $id): self
        {
            $this->id = $id;

            return $this;
        }

        public function getId(): int
        {
            return $this->id;
        }


        public function getShopUrl(): string
        {
            return $this->shopUrl;
        }

        public function getKitchen(): Kitchen
        {
            return $this->kitchen;
        }

        public function setKitchen(Kitchen $kitchen): self
        {
            $this->kitchen = $kitchen;
            $this->account_id = $kitchen->getId();
            return $this;
        }

        public function setAccount_id(int $account_id): self
        {
            $this->account_id = $account_id;

            return $this;
        }

        public function getAccount_id(): int
        {
            return $this->account_id;
        }

    }

与其他实体相比,内阁有一些逻辑(这是我真正需要帮助的地方)。由于卧室和厨房与房屋相关联,我想给出一个卧室,然后查找与卧室相同的房屋关联的所有厨房,然后返回这些厨房拥有的所有橱柜。我知道这可能看起来不合逻辑,但我发现这一点为时已晚,无法提出另一个概念。我当前的代码不起作用,因为我不确定这是否可能,而且因为它对我来说有点太复杂了,目前无法掌握。但我将其作为内阁回购的内容:


    <?php

    namespace App\Repository;

    use App\Entity\Bedroom;
    use App\Entity\House;
    use App\Entity\Cabinet;
    use App\Entity\Kitchen;
    use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use Symfony\Bridge\Doctrine\RegistryInterface;

    /**
     * @method Cabinet|null find($id, $lockMode = null, $lockVersion = null)
     * @method Cabinet|null findOneBy(array $criteria, array $orderBy = null)
     * @method Cabinet[]    findAll()
     * @method Cabinet[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
     */
    class CabinetRepository extends ServiceEntityRepository
    {
        public function __construct(RegistryInterface $registry)
        {
            parent::__construct($registry, Cabinet::class);
        }

        public function findByBedroom(Bedroom $bedroom) //use joins??
        {
            return $this->createQueryBuilder('cabinet')
                ->join('cabinet.bedroom', 'bedroom')
                ->join('cabinet.kitchen', 'kitchen')
                ->addSelect('cabinet')
                ->andWhere('cabinet.bedroom = :idBedroom')
                ->setParameter('idBedroom', $bedroom->getId())
                ->orderBy('time', 'ASC')
                ->getQuery()
                ->getResult();
        }
    }

我正在使用 PHPStorm,并且没有任何错误显示,但是当然,查询生成器不会返回任何内容。我该如何修复它?我找不到任何试图实现我想做的事情的问题。

我手动将数据添加到数据库中,所以里面有数据。使用 Sequel Pro 我可以看到这些关系。数据(就我而言)很好。 queryBuilder 就是错误所在。

带有一些数据的演示示例:

这是卧室数据:

id     name              house_id  
325    bigBedroomOne     1666   
815    smallBedroomOne   555   
902    bigBedroomTwo     1666

这是众议院数据:

id     name          
1666   bigHouse      
555    smallHouse      

这是厨房数据:

id   name              house_id
1    bigKitchen        1666
2    smallKitchen      555
55   mediumKitchen     555

最后,这是机柜数据:

id  shopUrl    account_id
1   ur.l       55
88  co.m       2
33  ne.t       1

所以在这个例子中我想插入卧室 ID815与 house_id 相关联555。然后从那里应该选择与该 house_id 关联的所有厨房,所以2 and 55。最后,带有 id 的柜子1 and 88应该被退回。

编辑:运行时bin/console doc:sch:val我得到这个回来:

`Mapping

[确定] 映射文件正确。

Database

[确定] 数据库架构与映射文件同步。


在 symfony 的调试栏中,您可能会看到一些原则错误。这些不会出现在 PHPStorm 中。你需要重命名$kitchen and $bedroom其复数形式$kitchens and $bedrooms(并更改您的 getter/setter 来匹配),因为这是您在教义关系的拥有方中定义事物的方式。

比存储库方法更简单的方法是在控制器中执行您想要的操作,让原则完成您的繁重工作:

$cabinets = [];

$house = $bedroom->getHouse();
$kitchens = $house->getKitchens();
foreach ($kitchens as $kitchen) {
    $kitchenCabinets = $kitchen->getCabinets();
    $cabinets = array_merge($cabinets, $kitchenCabinets);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用查询生成器在 Symfony 4 中连接外部 ID 上的多个实体? 的相关文章

随机推荐

  • EF Core - System.InvalidOperationException:ExecuteReader 需要打开且可用的连接。连接的当前状态已关闭

    我正在使用 Entity Framework Core 运行 ASP NET Core 1 0 Web 应用程序 当应用程序运行一段时间 24 48 小时 时 应用程序在对任何端点或静态资源的每个请求上开始崩溃 并引发错误System In
  • 复制范围,包括粘贴到 Outlook 电子邮件正文时的格式

    我已经搜索了这个问题 但仍然没有得到它的确切代码 我需要将数据透视表的颜色从 Excel 复制到 Outlook 主体 运行代码时 我得到了格式 但唯一的问题是表格的颜色变成了黑色和灰色 请帮助我弄清楚如何放置我需要的确切颜色 这是我的代码
  • 包括 Google 字体链接或导入?

    在页面上包含 Google 字体的首选方式是什么 Via the tag 通过样式表中的导入 import url https fonts googleapis com css2 famil
  • 按列快速串联数千个文件

    我在用R使用以下命令绑定约 11000 个文件 dat lt do call bind cols lapply lfiles read delim 这慢得令人难以置信 我使用 R 是因为我的下游处理 例如创建绘图等 是在 R 中进行的 按列
  • WCF VS.旧版 ASP.Net Web 服务 [重复]

    这个问题在这里已经有答案了 可能的重复 Web 服务 WCF 与标准 谁能给我推荐一些文档来描述为什么 WCF 比旧版 ASP NET Web 服务更好 我对性能和安全性特别感兴趣 WCF 更加灵活 可以通过 HTTP 使用 如旧版 ASM
  • TypeError:“int”类型的对象没有 len() 需要错误帮助[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在为我的代码编写一段代码 当用户输入 7 位数字时 它会将这些数字分别乘以 3 和 1 这是代码 当它检查用户是否输入了 7 位数字时 出现以下错误 类型错误 int 类型的对象没有
  • 使用 Bouncy Castle c# 创建 CRL 文件

    我已经使用 Bouncy Castle 构建了自己的根 CA 证书 并使用它来构建其他证书 我想使用 Bouncy Castle C 构建一个证书吊销列表 CRL 以包含已吊销的证书列表 例子 Retrieve CA root certif
  • 多项式函数的 LinEst vba

    我正在尝试使用 vba 计算多项式回归 首先 我尝试了 y x 2 b OUTPUT WorksheetFunction Application LinEst A Application Power C 2 True True 其中 A 和
  • 显示:弯曲和图像大小调整/居中

    我在用display flex 使图像居中并max width max height来调整它的大小 其中有几张图像 有些宽 有些高 有些正方形 我想确保它们的尺寸都足够大以供查看 例如 我假设如果图像达到最大宽度而不是高度 则它应该与宽度保
  • 减少()有什么问题?

    关于Python 3 0中reduce 函数的变化以及如何删除它 网上似乎有很多激烈的讨论 我有点难以理解为什么会出现这种情况 我发现在各种情况下使用它是相当合理的 如果这种蔑视只是主观的 我无法想象会有这么多人关心它 我缺少什么 减少 有
  • 使用 ggsave 将系统时间和日期添加到 pdf

    我有一个 pdf 文件 我试图打印该 pdf 文件名称上的时间和日期 我尝试使用很多不同的方法 但仍然一无所获 你能帮我吗 打印为pdf的代码如下 ggsave Title of file pdf marrangeGrob grobs pl
  • 加载、保存然后再次加载图像会抛出“GDI+ 中发生一般错误”

    This 似乎犯了臭名昭著的错误 我记得不久前得到了不同的代码 但是它回来了 复仇 但有一些我似乎无法弄清楚的新代码 绝对是generic 一定 The Goal 我正在尝试构建一个表单 允许用户 选择一个图像 按 保存 关闭表单 然后将图
  • Android Studio导入facebook库奥德赛

    我正在尝试通过 Android Studio 中的 Facebook 库在我的应用程序中使用 Facebook 登录 在学习了 9 个关于如何在 Android Studio 0 6 1 上导入该库的教程之后 在单击 清理项目 之前一切都很
  • 使用 ColdFusion 的 SAML 服务提供商

    我正在尝试使用 ColdFusion 9 对 SAML 2 0 进行测试 我想要的只是使用 SAML 生成的 xml 并进行处理 我正在关注这里给出的文章http blog tagworldwide com p 19 存档版本 但是当我启动
  • WordPress 全局 $post 变量为空

    我正在开发一个 WordPress 插件 管理背景图像 当我尝试使用 global post print r post 该对象是空的 可能有一些必需的数据 我不知道是什么 如果您知道请帮助我 WordPress 全局变量 post包含当前的
  • 如何优雅地终止一个进程?

    我想终止多个进程 但我想让每个进程都有机会保存其数据 询问用户有关保存文件的信息 甚至忽略关闭请求 So TerminateProcess这是不可能的 因为它会立即终止进程 另一种方法是使用SendMessage PostMessage发送
  • case 类私有构造函数 - 需要 readResolve 实现

    我只是在谷歌上搜索如何使用私有构造函数创建案例类 以下是执行此操作的正确方法 如中所述 如何在案例类同伴中覆盖 apply object A def apply s String i Int A new A s toUpperCase i
  • 创建列表视图并从 flutter 上的 firestore 获取数据

    我有一个应用程序 我需要将这些数据从 firestore 数据库一一获取到 flutter 上的 Listview 我尝试了很多东西 例如流构建器和未来构建器 但我无法得到 因为我的数据库使用嵌套数据如果您有任何建议 请告诉我 非常感谢 有
  • 需要 preg_match_all 链接

    我有一个像这样的字符串 string some text http dvz local index index regionId 28 http stuff kiev ua roadmap page php http 192 168 3 1
  • 如何使用查询生成器在 Symfony 4 中连接外部 ID 上的多个实体?

    我正在努力学习 Symfony 今天我正在关注关联教程 我决定制作一个小应用程序 包括房屋 厨房 卧室和橱柜 我 尝试 使用draw io制作一个小的类图 以便为您提供更好的想法 所以基本上一栋房子可以有多个卧室和多个厨房 每个厨房可以有多