ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – Doctrine:只查询关系不存在的地方?

2019-07-21 21:18:10  阅读:158  来源: 互联网

标签:php mysql doctrine symfony1


我有两个表:文章和类别.文章可以分配一个类别.但他们不必拥有类别.

架构:

Article:
  columns:
    title:
      type: string(255)
    content:
      type: string(255)
    category_id:
      type: integer(4)

Category:
  columns:
    name:
      type: string(255)
    article_id:
      type: integer(4)
  relations:
    Article:
      class: Article
      local: article_id
      foreign: id
      foreignAlias: ArticleCategories

我可以查询所有分配给他们的类别的文章,如下所示:

$articles= Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c ON c.article_id = a.id')
  ->where('c.id > 0')
  ->execute();

它返回:

Object->Array
(
  [0] => Array
  (
    [id] => string(1) "1"
    [title] => string(4) "test"
    [content] => string(4) "test"
    [Category] => Array
    (
      [0] => Array
      (
        [id] => string(1) "2"
        [name] => string(7) "testing"
      )
    )
  )
etc...

我需要做的是查询没有类别关系的文章.我不能只说 – > where(‘c.id = NULL’),因为如果没有Category关系,那么对象中没有返回任何[Category]数组.它只返回id,title和content.另外我不能说 – > where(a.Category = NULL)因为Category不是Article的列.

有任何想法吗?

UPDATE
我在Schema上犯了一个错误并更新了它.我知道,一个类别只与一篇文章有​​关系,但实际上我没有使用文章/类别.我只是用这些术语作为例子.

解决方法:

更新:

因此,如果您希望将文章作为主要对象,最简单的方法是执行一个leftJoin,其条件为fk为null.无论连接的右侧是否具有相应的记录,LEFT JOINs始终会抓取连接左侧的记录.所以没有你从根本上得到所有文章的结果.因此,我们可以通过使用where条件来过滤那些不具有类别的文章的那些…非常类似于之前:

$articles = Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c')
  ->where('c.article_id IS NULL')
  ->execute();

没有理由指定on条件.学说将根据实际情况确定这一点.另外,你不需要使用这种类型的filtereing使用内连接的位置,内连接只会选择存在关系的迭代(即有一个a.category_id = c.id)所以你发布的查询实际应该是:

$articles = Doctrine_Query::create()
  ->from('Article a')
  ->innerJoin('a.Category c')
  ->execute();

要获取没有任何类别的文章,您可以在文章中查找category_id为null:

$articles= Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c')
  ->where('a.category_id IS NULL')
  ->execute();

Id可能会删除连接,因为它不是必需的,除非您因某种原因需要结果中的空列.

标签:php,mysql,doctrine,symfony1
来源: https://codeday.me/bug/20190721/1495435.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有