【问题标题】:Symfony2 Custom Query Only Returning 1 Record, Should Return MultipleSymfony2 自定义查询仅返回 1 条记录,应该返回多个
【发布时间】:2014-02-05 19:03:22
【问题描述】:

我有 3 个表要连接在一起,分别是“PurchaseOrderProductsStatus、Product 和 PutAway”表。

PurchaseOrderProducts状态表

id  | product_id | 
----------------------
10  | 1      |

产品表

id  | Name            | 
---------------------------
1   | Acme Product 123

收起表

id  | product_id | 
----------------------
100 | 1
101 | 1

我能够将数据输出到屏幕上,我遇到的问题是它只从我的 PutAway 表中返回 1 行。它应该像这样返回 2 行...

Acme Product 123
        100 - Acme Product 123
        101 - Acme Product 123

这是我的自定义查询。我究竟做错了什么?

$query = $this->getEntityManager()
->createQuery('
SELECT      pops, pr, pa
FROM        WIC\PurchaseOrderBundle\Entity\PurchaseOrderProductsStatus pops
LEFT JOIN   pops.product pr
LEFT JOIN   pr.putAway pa
WHERE       pops.inventoryLocation = :id
AND         pops.account = :account_id
')
->setParameter('id', $id)
->setParameter('account_id', $account_id);

关于我的设置的一些信息。在我的产品实体中,我有一个用于 PutAway 表的 oneToMany 关联。

/**
 * @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product", fetch="EAGER")
 */
protected $putAway;

public function __construct()
{
    $this->putAway = new ArrayCollection();
}

这是我的树枝模板:

{% for action in productActions %}
    <tr>
        <td>{{ action.product.id }}</td>
        <td>{{ action.product.sku }}</td>
        <td>{{ action.product.name }}</td>
        <td>{{ action.qty }}</td>
        <td>0</td>
    </tr>
    <tr>
        <td colspan="5">
            <div class="row-fluid">
                <div class="span2">
                    <table class="table table-striped table-bordered">
                        <thead>
                        <tr>
                            <th>Purchase Order</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr>
                            <td></td>
                        </tr>
                        </tbody>
                    </table>
                </div>
                <div class="span10">
                    <table class="table table-bordered" id="put_away_{{ action.product.id }}">
                        <thead>
                        <tr>
                            <th>Put Away Location</th>
                            <th>Quantity</th>
                            <th>Date</th>
                            <th>Entered By</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for putAway in action.product.putAway %}
                            <tr class="info">
                                <td>{{ putAway.inventoryLocation.name }}</td>
                                <td>{{ putAway.qty }}</td>
                                <td>{{ putAway.created|date("m/d/Y") }}</td>
                                <td>{{ putAway.createdBy.firstName }} {{ putAway.createdBy.lastName }}</td>
                            </tr>
                        {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
        </td>
    </tr>
{% endfor %}

【问题讨论】:

  • 你能用PutAway#product属性更新问题吗?你在那里定义了什么@JoinColumn?另外,检查开发工具栏以查看正在执行的查询并尝试直接从SQL 控制台运行它...
  • 请原谅我的无知,我不知道这是什么意思“你能用 PutAway#product 属性更新问题吗”。我是 Symfony 的新手。
  • 没关系,由于更好的格式化能力,我会继续写成“asnwer”;)

标签: php mysql sql symfony doctrine-orm


【解决方案1】:

我看到你已经定义了以下关系:

/**
 * @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product",     fetch="EAGER")
 */
protected $putAway;

mappedBy="product" 告诉我PutAway 实体具有product 属性-可能定义为@ManyToOne(相反)。

您可能知道,在关系中,如果您省略 @JoinColumn(或 @JoinTable 表示多对多)Doctrine 将采用默认列名并尝试加入表。但是,这可能会产生意想不到的结果(例如您的)。

现在重要的部分:如果您想确保使用正确的列,您需要在关系的一侧设置@JoinColumn 注释。在您的示例中:

产品实体

/**
 * @ORM\OneToMany(targetEntity="WIC\InventoryBundle\Entity\PutAway", mappedBy="product",     fetch="EAGER")
 * @ORM\JoinColumn(name="id", referencedColumnName="id_product")
 */
protected $putAway;

替代解决方案是:

PutAway 实体

/**
 * @ORM\ManyToOne(targetEntity="WIC\InventoryBundle\Entity\Product", inversedBy="putAway", fetch="EAGER")
 * @ORM\JoinColumn(name="id_product", referencedColumnName="id")
 */
protected $product;

@JoinColumn注解中:

  • name 代表本地(嗯,也许是更好的术语)列
  • referencedColumnName代表国外栏目

这行得通吗?

【讨论】:

  • 是的,这与我已有的功能相同。我仍然只能返回一个“PutAway”记录,而不是两个“PutAway”记录。我只是不知道为什么它只会返回 1 而不是两个。我将您的行“* @ORM\JoinColumn(name="id", referencedColumnName="id_product")”添加到产品实体,但返回的结果数量没有变化。
  • 很奇怪。好的,尝试单击调试工具栏中的“查询”。那应该给你所有执行的查询。找到这个将其添加到您的问题中;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2020-01-25
  • 2012-08-25
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多