草庐IT

php - Doctrine2 首先查询具有特定值的 orderBy

coder 2023-10-20 原文

我正在尝试使用 Doctrine 将多个过滤器应用于 Symfony 中的一个 dql。我想按几列排序(尽管目前我只有一列有问题)并且我想显示与特定值匹配的第一个值。我将写一个简单的例子来说明我正在搜索的结果:

col1                   col1
----                   -----
A                       B
B            =>         A
C                       C
W                       W

我正在搜索有关如何制作它的信息,但我有点困惑,因为有些人说我不能直接做,其他人说可以使用 case whenif/else。我尝试使用 case when 但没有成功。我使用的代码如下:

更新的代码和错误

$query = $this->createQueryBuilder('article')
                ->where('article.title LIKE :article')
                ->setParameter('title', '%'.$term.'%')
                ->addSelect('(CASE WHEN article.to = \'WOR\' THEN 1 ELSE 0 END) AS to')
                ->addOrderBy('article.to', 'ASC')
                ->getQuery();

如果我想将“B”值设置为参数,我应该在 addSelect 之后使用 setParameter 吗?

现在使用上面的代码我得到以下错误:

Key "title" for array with keys "0, to" does not exist in result.html.twig at line 177. 

有关我如何将此方法调用到我的 Controller 并将其传递给 twig 模板的信息:

        $prodMan = $this->get('app.article.manager');
        $articles = $prodMan->getResults((string)"t", $page);
        $limit = 50;
        $maxPages = ceil($articles->count() / $limit);
        $thisPage = $page;
        return $this->render('result.html.twig', compact('categories', 'maxPages', 'thisPage', 'articles', 'images'));

还有我出错的 Twig 模板:

<td><p>{{articles.title}}></p></td>

{{ dump(articles) }} 的结果

Paginator {#475 ▼
  -query: Query {#484 ▼
    -_state: 2
    -_dql: "SELECT article, (CASE WHEN article.to = 'WOR' THEN 1 ELSE 0 END) AS to FROM AppBundle\Entity\Article article WHERE article.title LIKE :title ORDER BY article.to ASC"
    -_parserResult: null
    -_firstResult: 0
    -_maxResults: 50
    -_queryCache: null
    -_expireQueryCache: false
    -_queryCacheTTL: null
    -_useQueryCache: true
    #parameters: ArrayCollection {#483 ▼
      -elements: array:1 [▼
        0 => Parameter {#480 ▼
          -name: "title"
          -value: "%t%"
          -type: 2
        }
      ]
    }
    #_resultSetMapping: null
    #_em: EntityManager {#105 …10}
    #_hints: []
    #_hydrationMode: 1
    #_queryCacheProfile: null
    #_expireResultCache: false
    #_hydrationCacheProfile: null
  }
  -fetchJoinCollection: true
  -useOutputWalkers: null
  -count: 143
}

我在没有 when 的情况下执行了相同的 dql 查询(使用那个 dql 我没有任何问题),并且我比较了 Twig 中的转储,我看到的唯一区别是在另一个 dql 中我得到了#483和 #482 索引分别代替 #484 和 #480

而且我不能 var_dump 数组的任何位置,但是数组有正确数量的结果,虽然我不能检查结果是否以正确的方式排序 我被这个问题困住了,如果有人能引导我找到正确的答案,我将不胜感激!

最佳答案

我不确定您的查询是否有效,但是如果您像这样更改此行会怎样:

->addSelect('(CASE WHEN article.to = \'B\' THEN 1 ELSE 0 END) AS HIDDEN to')

转义引号,或者:

->addSelect("(CASE WHEN article.to = 'B' THEN 1 ELSE 0 END) AS HIDDEN to")

这样 B 就在引号中。同样,不确定查询本身。


编辑 #2 - 基于文章转储

看起来转储仍然是一个查询。 您需要得到这样的结果:

$articles = $query->getResult();

然后将文章传递给你的 twig 并渲染它。 通常这样做:

return $this->render('result.html.twig', array(
        'articles' => $articles,
));

看看是否可行。 您可能需要更改,但上面的代码可以让您了解该怎么做。

关于php - Doctrine2 首先查询具有特定值的 orderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434810/

有关php - Doctrine2 首先查询具有特定值的 orderBy的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  7. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  8. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

  9. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  10. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

随机推荐