用 Dotrine 查询语言写“NOT IN”

2023-12-11

我有两张桌子company(id, ...) and company_has_wtax(company_id, ....)。我需要获取所有不在其中的公司company_has_wtax桌子。原始 SQL 应该是这样的:

SELECT id FROM company LEFT JOIN (company_has_wtax) 
                       ON company.id = company_has_wtax.company_id

但我不知道如何在 Doctrine 的 DQL 上构建它,有什么帮助吗?

将方法添加到存储库并从控制器调用它

这是我在 @Javad 留下答案后编写的代码:

public function findCompanyByDocument() {
    $q2 = $this->createQueryBuilder('ApprovalBundle:CompanyHasWtax c2');

    $query = $this->createQueryBuilder('c')
            ->leftJoin('c.CompanyHasWtax', 'chw')
            ->where($query->expr()->notIn('c.id', $q2->select('c2.company')->getDQL())
    );

    echo $query->getQuery()->getSQL();
    // return $query->getQuery()->getResult();
}

这就是我在控制器中的调用方式:

$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('RegisterCompanyBundle:Company')->findCompanyByDocument();

但我收到这个错误:

ContextErrorException:注意:未定义的变量:查询 /var/www/html/kraken/src/Company/RegisterCompanyBundle/Entity/Repository/CompanyRepository.php 40号线

第 40 行在哪里->where($query->expr()->notIn('c.id', $q2->select('c2.company')->getDQL()).

这是实体:

Company.php

class Company {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", unique=true, nullable=false)
     * @ORM\GeneratedValue
     * 
     */
    protected $id;

    /**
     * @ORM\Column(name="legal_name",type="string",nullable=false,length=255)
     * @Assert\NotBlank(message="Este valor no debería estar vacío.")
     * @Assert\Regex("/^[a-zA-Z0-9ñÑÁÉÍÓÚñáéíóú\s\,]+$/", message="Este valor debería ser de tipo alfanumérico.")
     */
    protected $legalName;

    /**
     * @ORM\Column(name="social_reason",type="string",nullable=false,length=255)
     * @Assert\NotBlank(message="Este valor no debería estar vacío.")
     * @Assert\Regex("/^[a-zA-Z0-9ñÑÁÉÍÓÚñáéíóú\s\,]+$/", message="Este valor debería ser de tipo alfanumérico.")
     */
    protected $socialReason;

    /**
     * @ORM\Column(name="tax_id",type="string",nullable=false)
     * @Assert\NotBlank(message="Este valor no debería estar vacío.")
     * @Assert\Regex("/^[\d{9}$]/", message="Este valor debería tener exactamente 9 caracteres.")
     */
    protected $taxId;

    /**
     * @ORM\OneToOne(targetEntity="Common\MediaBundle\Entity\Media")
     * @ORM\JoinColumn(name="logo", referencedColumnName="id")
     */
    protected $logo;

    /**
     * @ORM\OneToOne(targetEntity="Common\MediaBundle\Entity\Media")
     * @ORM\JoinColumn(name="banner", referencedColumnName="id")
     */
    protected $banner;

    /**
     * @ORM\OneToOne(targetEntity="Company\RegisterCompanyBundle\Entity\NCompanyType")
     * @ORM\JoinColumn(name="type", referencedColumnName="id")
     */
    protected $type;

    /**
     * @ORM\OneToOne(targetEntity="Company\RegisterCompanyBundle\Entity\NCompanyStatus")
     * @ORM\JoinColumn(name="status", referencedColumnName="id")
     */
    protected $status;

    /**
     * @ORM\Column(type="integer",nullable=false,length=1)
     */
    protected $certified;    
}

CompanyHasWtax.php

class CompanyHasWtax {

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Company\RegisterCompanyBundle\Entity\Company")
     * @ORM\JoinColumn(name="company", referencedColumnName="id")
     */
    protected $company;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Configuration\FeeBundle\Entity\Fee")
     * @ORM\JoinColumn(name="wtax", referencedColumnName="id")
     */
    protected $wtax;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\User\SecurityBundle\Entity\User")
     * @ORM\JoinColumn(name="kuser", referencedColumnName="id")
     */
    protected $user;

    /**
     * @ORM\Column(name="from_date", type="datetime")
     */
    protected $from_date;

    /**
     * @ORM\Column(name="to_date", type="datetime")
     */
    protected $to_date;

}

丑陋的解决方案

我找到了一种方法来实现这一点,但这对我来说很丑陋,而且有人说我这样做是不对的:

public function findCompanyByDocument() {
    $sql = "SELECT * FROM company c WHERE c.id NOT IN (SELECT chm.company FROM company_has_media chm WHERE chm.company = c.id)";
    $em = $this->getEntityManager();

    return $em->getConnection()->fetchAll($sql);
}

尝试这个:

$q2 = $this->createQueryBuilder('c')
    ->select('IDENTITY(c2.company)')
    ->join('RegisterCompanyBundle:CompanyHasMedia', 'c2', 'WITH', 'c2.company = c.id');

$query = $this->createQueryBuilder('c3');
$query->where($query->expr()->notIn('c3.id', $q2->getDQL()));

$companies = $query->getQuery()->getResult();

请注意,我们通过reverseBy/mappedBy从不相关的实体创建了查询
我们需要对相关表的特定字段使用IDENTITY

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 Dotrine 查询语言写“NOT IN” 的相关文章

随机推荐

  • jsx 中的 if-else 语句:ReactJS

    我需要更改渲染函数并在给定特定状态时运行一些子渲染函数 例如 render return
  • 如何通过函数返回 cy.request 的响应

    我正在尝试使用以下函数传递 API 请求的结果 Add someName cy request method POST url someURL body name someName then function response return
  • 使用 RODBC 将 SQL 存储过程结果转换为 data.frame 格式

    我正在使用 RODBC 包在 SQL 服务器中查询结果 我编写了一个特定的存储过程 当在我的 SQL Server 管理中执行时 studio 例如 返回一个表 但是 当我通过 R 运行查询时 它返回character 0 Execute
  • 如何从响应正文获取数据[重复]

    这个问题在这里已经有答案了 我现在正在使用 Java 中的 Youtube API 并设法将一些数据存储为CommentThreadListResponse 这是其节点的示例 但列表包含大约 100 个节点 snippet topLevel
  • 更改 WPF DatePicker 的字符串格式

    我需要更改 WPF 工具包 DatePicker 中 DatePickerTextBox 的字符串格式 以使用连字符而不是斜杠作为分隔符 有没有办法覆盖这个默认区域性或显示字符串格式 01 01 2010 我在这段代码的帮助下解决了这个问题
  • 如何使用Power Point VBA代码从文本文件中逐行读取行?

    此代码将从文本文件中读取一行 set file CreateObject Scripting FileSystemObject OpenTextFile c number txt 1 text file ReadLine MsgBox te
  • 将数据流式传输到基于 Web 的(角度)前端的现代方法

    tldr 我想建立一个带有实时显示数据的节点后端的角度应用程序 数据流的源是kafka流 其数据存储在postgres数据库中 我对某些主题很陌生 但有信心可以启动并运行它 但很可能不是以 最佳实践 方式 我无法弄清楚什么是现代且有效的方法
  • 常数的大O表示法

    我计算出我的运行时复杂度是4 这个的大O表示法是什么 例如 如果我的运行时复杂度是4 n那么它的大O O n 让我们宽松地看一下我们所说的定义f n is in O g n f n is in O g n 意思是c g n 是上界f n 于
  • 我如何要求对泛型类型的引用可以与泛型类型进行比较以确保相等?

    我正在尝试实现一种依赖于模幂的算法 我找不到任何适用于本机类型的模幂结构 例如u64 仅适用于 bigint 所以我想我应该编写一个标准重复平方法模幂 这是我想出的 fn powm base u64 exponent u64 modulus
  • FQL 中 CONTAINS() 的文档?

    最近有several 问题 posted在 Facebook SO 上使用CONTAINS in the WHERE条款 它的工作原理似乎类似于 Graph API 搜索功能 并且充当索引字段 对于 FQL 开发人员来说 这一切都是伟大的事
  • 如何在静态库中包含静态库?

    我在两个不同的文件夹中有 2 个静态库 libA and libB libB必须包括libA 我的主要 CMakeLists txt 是 add subdirectory libA add subdirectory libB 我的第一个错误
  • UITableViewCell 分组样式中的方形而不是圆角

    我希望分组的表格视图单元格具有方角 而不是默认的圆角 而且我不仅仅想使用图像来实现这种效果 是否可以 最简单的是 在你的tableView cellForRowAtIndexPath use cell backgroundView UIVi
  • PHP 和 FFMPEG - 执行智能视频转换

    我有一项异常困难的任务要执行 我以为这很容易 但我的所有努力都没有结果 我正在将上传到 php 脚本的视频从各种格式 avi mpg wmv mov 等 转换为单一 flv 格式 转换效果很好 但我遇到的问题是视频的分辨率 这是我当前正在运
  • 覆盖 WPF 模板时,是否必须单独覆盖每个主题的模板?

    我需要更改 WPF ComboBox 模板的一小部分 如果我复制 Luna 主题的现有模板并进行更改 那么最初一切都会正常工作 但如果用户有不同的主题 我的ComboBox保留了它的自定义主题 这显然是基于 Luna 所以看起来不合适 有没
  • 如何使用谓词从核心数据中获取偶数和奇数值

    我想从我的核心数据实体中获取偶数和奇数值 请查看下面的代码并进行更正 因为它会使应用程序崩溃 NSPredicate predicate if leadFilter rank isEqualToString Even predicate N
  • 在 Delphi 中为 MySQL 创建 UDF

    如何使用 Delphi 创建 MySQL 的 UDF 有人有代码模板吗 我希望将代码模板集成到 Delphi 版本 2007 及更高版本 中 因此我需要这些模板在有或没有 Unicode 支持的情况下都可以使用 首先 谷歌透露 文档 论坛主
  • 如何在 JavaScript 中将哈希值转换为单个对象?

    我有一个以下格式的对象数组 var log billkey Name billvalue ABC billkey Department billvalue Computer 我想将其转换为单个对象 例如 var log Name ABC D
  • Rails 3 提交标签 + html_safe

    这行代码有什么问题吗 这实际上产生 显然我的 html safe 调用没有做任何事情 背景 我在用着推特引导程序也字体真棒我本质上是想实现一个带有图标的提交按钮 为了扩展卢卡斯的答案 我需要一个按钮标签而不是输入 这段代码产生了我想要的效果
  • Maven 无法解决本地依赖关系

    我有一个 Maven 项目 其中包含一个带有外部 jar 文件的项目内存储库 我使用 install 命令将 jar 文件安装到项目内存储库中 当我检查存储库时 jar 文件已安装 我还在pom文件中添加了依赖配置 但是当我运行 mvn 编
  • 用 Dotrine 查询语言写“NOT IN”

    我有两张桌子company id and company has wtax company id 我需要获取所有不在其中的公司company has wtax桌子 原始 SQL 应该是这样的 SELECT id FROM company L