<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symfony中文教程 &#187; Doctrine QueryBuilder</title>
	<atom:link href="http://www.newlifeclan.com/symfony/archives/tag/doctrine-querybuilder/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/symfony</link>
	<description>站在巨人肩膀上的phpweb框架</description>
	<lastBuildDate>Fri, 12 Dec 2025 00:58:27 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>KU案例2之12 Doctrine QueryBuilder</title>
		<link>http://www.newlifeclan.com/symfony/archives/432</link>
		<comments>http://www.newlifeclan.com/symfony/archives/432#comments</comments>
		<pubDate>Fri, 10 Apr 2015 08:47:02 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[实战教程]]></category>
		<category><![CDATA[Doctrine QueryBuilder]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/symfony/?p=432</guid>
		<description><![CDATA[<p>如果我们想通过匹配email或者username字段来找到一个用户。我们会在UserRepository里增加 [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/432">KU案例2之12 Doctrine QueryBuilder</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>如果我们想通过匹配email或者username字段来找到一个用户。我们会在UserRepository里增加一个findOneByUsernameOrEmail方法：</p>
<p><span id="more-432"></span></p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/Entity/UserRepository.php
// ...

class UserRepository extends EntityRepository
{
    public function findOneByUsernameOrEmail()
    {
        // ... todo - get your query on
    }
}</pre><p>你可以使用Doctrine查询语言DQL来查询数据，他类似与sql语法。如果你做的事情非常的复杂，你甚至可以使用原生的sql查询。</p>
<p>但大多数的时候，我建议使用这个查询生成器对象。createQueryBuilder并传入一个“别名”。现在添加一个where子句来输入我们的OR逻辑：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/Entity/UserRepository.php
// ...

public function findOneByUsernameOrEmail($username)
{
    return $this-&gt;createQueryBuilder('u')
        -&gt;andWhere('u.username = :username OR u.email = :email')
        -&gt;setParameter('username', $username)
        -&gt;setParameter('email', $username)
        -&gt;getQuery()
        -&gt;getOneOrNullResult()
    ;
}</pre><p>查询生成器有你期望的每一个方法，例如leftJoin，<tt class="docutils literal"><span class="pre">orderBy和groupBy。他们用起来都很得心应手。</span></tt></p>
<p>andWhere里面的语句类似于sql，只是我们使用了两个变量作为“占位符”。通过调用setParamete来给变量赋值。之所以分为两个部分，主要是防止sql注入攻击。</p>
<p>要完成查询，还需要调用getQuery，然后调用getOneOrNullResult。getOneOrNullResult顾名思义，就是如果没有找到就返回空，如果找到就返回用户对象。</p>
<blockquote><p>注意：想要了解更多的查询生成器，请参阅doctrine-project.org的QueryBuilder。</p></blockquote>
<p>来试试，让我们暂时使用EventController里的indexAction。使用getRepository来获取UserRepository。请记住，你传递给getRepository的参数是entity的“快捷名称”：bundle名称加上Entity名称。</p><pre class="crayon-plain-tag">// src/Yoda/EventBundle/Controller/EventController.php
// ...

public function indexAction()
{
    $em = $this-&gt;getDoctrine()-&gt;getManager();

    // temporarily abuse this controller to see if this all works
    $userRepo = $em-&gt;getRepository('UserBundle:User');

    // ...
}</pre><p>现在，我们有UserRepository，让我们尝试新方法并dump结果：</p><pre class="crayon-plain-tag">public function indexAction()
{
    // ...
    $userRepo = $em-&gt;getRepository('UserBundle:User');
    var_dump($userRepo-&gt;findOneByUsernameOrEmail('user'));die;

    // ...
}</pre><p>当我们刷新，我看到这个用户。如果我们想让email试试，我们要调整一下：</p><pre class="crayon-plain-tag">var_dump($userRepo-&gt;findOneByUsernameOrEmail('user@user.com'));die;</pre><p>酷！</p>
<p>我们以后会看到更多，在控制器中使用repository自带的方法来获取数据库对象。如果你需要一个特殊的查询，那就在你的repository中添加一个新的方法。</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/432">KU案例2之12 Doctrine QueryBuilder</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/symfony/archives/432/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
