在这种情况下如何使用 getCollection()

Posted

技术标签:

【中文标题】在这种情况下如何使用 getCollection()【英文标题】:How to use getCollection() in this case 【发布时间】:2014-05-30 10:05:12 【问题描述】:

我遇到了无法解决的问题。部分原因是我无法用正确的术语来解释它。我是新手,很抱歉这个笨拙的问题。

您可以在下面看到我的目标概览。

我正在使用 Magento CE 1.7.0.2。

我创建了一个模块,一切正常,但我遇到了 getCollection() 的问题。

$attrid = 64;
$collection = Mage::getModel('module/xyz')->getCollection()->addFieldToFilter('c_id',$attrid);

如果我的表中只有一条记录满足这种情况where c_id = $attrid,它就可以工作

但实际上where c_id = $attrid 那时我将有多个记录,它会给出以下错误

a:5:i:0;s:74:"Item (Namespace_Module_Model_Xyz) with the same id "64" already exist";i:1;s:6099:"#0 /var/www/com2/lib/Varien/Data/Collection/Db.php(576): Varien_Data_Collection->addItem(Object(Namespace_Module_Model_Xyz))

我也试过这样

$collection->addFieldToFilter(array(
    ->addFieldToFilter('c_id', array('eq'=>$attrid)
));

Table1(c_id 为主键)

c_id    title    value
-----   -----    -----
 64      my       1

Table2(autoc_id 为主键)

autoc_id     c1      c2     c3      c4      c-id
--------    ----    ----   ----    ----     ----
1           a1       b1     c1      d1      64
2           a2       b2     c2      d2      64
3           a3       b3     c3      d3      64
4           a4       b4     c4      d4      64

config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_Module>
            <version>0.1.0</version>
        </Namespace_Module>
    </modules>
    <frontend>
        <routers>
            <module>
                <use>standard</use>
                <args>
                    <module>Namespace_Module</module>
                    <frontName>module</frontName>
                </args>
            </module>
        </routers>
        <layout>
            <updates>
                <module>
                    <file>module.xml</file>
                </module>
            </updates>
        </layout>
    </frontend>
    <admin>
        <routers>
            <module>
                <use>admin</use>
                <args>
                    <module>Namespace_Module</module>
                    <frontName>module</frontName>
                </args>
            </module>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <module module="module">
                <title>Title</title>
                <sort_order>71</sort_order>               
                <children>
                    <items module="module">
                        <title>title2</title>
                        <sort_order>0</sort_order>
                        <action>module/adminhtml_module</action>
                    </items>
                </children>
            </module>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <Namespace_Module>
                            <title>Title Module</title>
                            <sort_order>10</sort_order>
                        </Namespace_Module>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <module>
                    <file>module.xml</file>
                </module>
            </updates>
        </layout>
    </adminhtml>
<global>
        <models>
            <module>
                <class>Namespace_Module_Model</class>
                <resourceModel>module_mysql4</resourceModel>
            </module>
            <module_mysql4>
                <class>Namespace_Module_Model_Mysql4</class>
                <entities>
                    <module>
                        <table>table1</table>
                    </module>
                </entities>
                <entities>
                    <flatrates>
                        <table>table2</table>
                    </flatrates>
                </entities>
            </module_mysql4>
        </models>
        <resources>
            <module_setup>
                <setup>
                    <module>Namespace_Module</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </module_setup>
            <module_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </module_write>
            <module_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </module_read>
        </resources>
        <blocks>
            <module>
                <class>Namespace_Module_Block</class>
            </module>
        </blocks>
        <helpers>
            <module>
                <class>Namespace_Module_Helper</class>
            </module>
        </helpers>
    </global>
</config>

但没什么用,我还是有同样的问题

我在这里做错了什么

有什么想法吗?

【问题讨论】:

不,不是这样,我可以获得多个记录 where c_id = 64;但现在当我只有一条记录 where c_id = 64; 【参考方案1】:

您是否尝试过检查表中的记录是否具有相同的 id? 我尝试查看核心库上的特定代码,发现集合中的项目必须具有唯一 ID,否则会引发异常。

<?php
public function addItem(Varien_Object $item)

    $itemId = $this->_getItemId($item);

    if (!is_null($itemId)) 
        if (isset($this->_items[$itemId])) 
            throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
        
        $this->_items[$itemId] = $item;
     else 
        $this->_addItem($item);
    
    return $this;

【讨论】:

那么 c_id 是你模型的主键吗? 是的,但实际上 c_id 和其他详细信息在不同的表中(在此表中)我将 c-id 存储为外键 你之前应该提到过。我假设您正在使用 join 获取集合,并且记录正在返回重复项。您可以做的是为该表设置一个新的主键,您仍然可以使用 c_id 作为外键。 请看看我的问题,我也更新了我的表格结构 你能不能也给我们看看你的模块的配置文件,我要看看你的资源模型是怎么设置的。【参考方案2】:

它似乎与您的主键有关,请仔细检查模型中的 _init() 设置,因为它使用了错误的主键列。

class MagePal_Module_Model_Mysql4_Xyx extends Mage_Core_Model_Mysql4_Abstract

    public function _construct()
       
        $this->_init('module/xyz', 'autoc_id');

【讨论】:

我已经尝试过这个,但我仍然有同样的错误&这里我没有给出 autoc_id 我从 URL 获取 c_id 值。如果值为 autoc_id 则表示它会完美运行但这里不同。 我从 URL 获得的 c_id 值我必须使用像“Select * from table2 where c-id=64”这样的查询我该怎么做?实际的问题是这个查询我' m 获得多条记录,这意味着 4 条记录,因为它给出了错误,例如“相同的 id”64“已经存在” 你清除缓存了吗?见***.com/questions/8751694/…

以上是关于在这种情况下如何使用 getCollection()的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下如何正确使用 asyncio?

在这种情况下如何使用 HashMap?

在这种情况下,如何使用 barh() 在条形图上显示值? [复制]

SwiftUI:如何在这种情况下将 .overlay 与 GeometryReader 一起使用?

在这种情况下如何使用 lastInsertId?

HTML 5 Gaming 是不是使用 Canvas 和 Javascript?在这种情况下如何防止作弊?