【问题标题】:Zend_Db magic method specific cell selectionZend_Db 魔术方法特定单元格选择
【发布时间】:2013-03-07 10:24:13
【问题描述】:

目前我正在进行一些与模型相关的改进,并研究我编写的特定查询。

$queryGetPages = $this->fetchAll($this->select()
                        ->where('page_active = ?', (int) $active)
                        ->order('page_rank ASC'));

if($queryGetPages) {
     $queryGetPages = $queryGetPages->toArray();

     foreach($queryGetPages as $key => $value) {
         $queryGetPagePrint = $this->find($value['pageid'])
         ->current()
         ->findModule_Model_ModulePagesPrintsViaModule_Model_ModulePagesFuses(
                                                            $this->select()
                                                            ->from('module_pages_prints', array('print_title'))                             
                                                            ->where('fuse_locale = ?', $this->_toolbox['editor']['translation']) )
    }                                                       
}

问题出在从相关表请求数据的魔术方法中。我只需要每行的“标题”单元格,但由于某种原因它不会让我这样做。即使使用此查询,它也会返回该行中的所有单元格。我做错了什么,但不知道是什么!

如果有人能指出正确的方向,我将非常感激。

最好的问候!

【问题讨论】:

  • findModule_Model_ModulePagesPrintsViaModule_Model_ModulePagesFuses 是迄今为止我见过的最糟糕的函数名称:D
  • @mingos:我真的不在乎你看到了什么。我正在尝试修复这里的一些错误...
  • 哦,有态度的提问者! “我不在乎你看到了什么,给我他妈的答案,我应得的”。不错,伙计,真的很不错。我只是在调查这个问题,打算为您提供解决方案,但我刚刚改变了主意。
  • 没问题,别人会帮忙的。我很抱歉我的态度,但现在不是正确的时间......
  • 很高兴听到您的道歉。如果您正在寻求帮助,请尽量减少对想要帮助的人的敌意。我们不会为此获得报酬,只能通过努力获得赞赏。

标签: zend-framework relationship zend-db-select


【解决方案1】:

在您的情况下隐式调用的函数是findManyToManyRowset()(Zend/Db/Table/Row/Abstract.php 中的代码,第 1001-1108 行(截至 ZF 1.12.1)。看看行1070-1072:

$select->from(array('i' => $interName), array(), $interSchema)
    ->joinInner(array('m' => $matchName), $joinCond, Zend_Db_Select::SQL_WILDCARD, $matchSchema)
    ->setIntegrityCheck(false);

简而言之:被调用的函数将覆盖您的from() 调用并从依赖表(module_pages_fuses)中选择所有行。这就是它的设计工作方式。

相反,我建议您以“愚蠢”的方式编写您实际需要的查询,例如

$queryGetPagePrint = $this->select()
    ->from(array('p' => 'module_pages_prints'), array('print_title'))
    ->join(array('f' => 'module_pages_fuses'),'p.pageid = f.pageid',array())
    ->where('f.fuse_locale = ?', $this->_toolbox['editor']['translation'])
    ->where('p.pageid = ?', $value['pageid']);

【讨论】:

  • 没错,我不是“愚蠢”方式的忠实粉丝哈哈。我之前尝试过几乎完全相同的查询,但它有点脏(即使你不喜欢我的函数名=D)。今晚我将深入探讨这一点。我暂时保持话题开放。谢谢
  • 它可能看起来“脏”或者,但我个人认为它实际上比由 lng 类名组成的神秘函数名更具可读性。另外,避免使用__call 和其他神奇的方法使IDE 更加了解您在做什么(代码完成、返回类型检查、正确性检查)。至少这是我个人的看法。
猜你喜欢
  • 2012-10-20
  • 2011-01-14
  • 2015-08-08
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多