【问题标题】:How to get one with children?带孩子怎么买?
【发布时间】:2018-02-05 10:38:04
【问题描述】:

我有一个简单的查询:

    $query = $qb->select('c, s')
        ->from('AppBundle:City', 'c')
        ->leftJoin('c.streets', 's')
        ->where('o.name = :name')
            ->setParameter('name', 'London')
        ->andWhere('s.numbers > :number')
            ->setParameter('number', 10000);

    $result = $query->getQuery()->getOneOrNullResult();

我想通过关系获得城市和街道。如果城市和街道的数字 > 10000 存在,则此查询运行良好,但如果城市存在且没有数字 > 10000,则此查询返回 null。为什么,如果我使用 leftJoin,而不是 join?

即使城市没有街道,我如何获得城市?

【问题讨论】:

  • 外连接的内表上的条件必须与 ON 进行 AND 运算,否则会将连接变为内连接。
  • @dnoeth 那我该怎么做呢?
  • 我不知道如何在 symfony 中做到这一点,我用 SQL 编写查询:-)
  • 您可以尝试从选择中删除s 吗?
  • 如果我从选择中删除 s,那么 andWhere 不起作用。

标签: php mysql sql symfony symfony-3.3


【解决方案1】:

如果您的实体Streets 实体映射到您的City 实体,那么您不需要这样的查询。

在 twig 中,只需执行以下操作:

{% for steet in city.streets %}
    <div>steet.name</div>
    <div>steet.length</div>
    <div>steet.etc</div>
{% endfor %}

否则,要更正您的查询,应该是这样的:

public function getCityStreets(City $city, $street) {
    // param $city :: Entity City
    // param $street :: Integer
    return $this->createQueryBuilder()
                ->select('c', 's')
                ->from('AppBundle:City', 'c')
                ->join('AppBundle:Streets', 's')
                ->where('c.name = :city')
                ->andWhere('s.number = :street_number')
                ->andWhere('s.city = :street_city)
                ->setParameters(array(
                    new Parameter('city', $city->getName()),
                    new Parameter('street', $street),
                    new Parameter('street_city', $city->getId()),
                ))
                ->getQuery()
                ->getArrayResult();
}
  • o.name 在您的查询中无效...o 未在任何地方设置
  • 'c.streets', 's' 也无效,您可以加入Steets,但不能作为来自City 的列
  • leftJoin 可以是 join,因为您已将 Streets 映射到 City,因此不应有任何 street.cityNULL

良好做法提示:实体名称绝不是复数

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2013-06-01
    • 2022-11-25
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多