質問

私が作成したざ回収このような計算からの距離latます。

$collection = Mage::getModel('module/module')->getCollection()->addFieldToFilter('status',1);
            $collection->getSelect()->columns(array('distance' => new Zend_Db_Expr("( 6371 * acos( cos( radians(23.0130648) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians(72.4909026) ) + sin( radians(23.0130648) ) * sin( radians( latitude ) ) ) )")))
            ->having('distance <10')
            ->order('distance ' . Varien_Db_Select::SQL_ASC);

がんエラー SQLSTATE[42S22]:カラムとなっています1054Unknown column'距離に有項'.

私が印刷collectionオブジェクトの距離の計算についてはその通りである。そうした問題なのでしょうか。

私の問題はこのような質問 発行の"有"のざ集

を使用していページングに収集すれば削除ページングのクラスはその作品にぴったりです。私は、こうしたな解決のソリューションを提供する。こちらはmyページ位置を示す。

_prepareLayout() 機能この

$pager = $this->getLayout()->createBlock('page/html_pager', 'pager');
          $pager->setAvailableLimit(array(5=>5,10=>10,20=>20,'all'=>'all'));
          $pager->setCollection($this->getCollection());
          $this->setChild('pager', $pager);
          $this->getCollection()->load();
          return $this;

追加機能もブロックのファイル

  public function getPagerHtml()
  {
    return $this->getChildHtml('pager');
  }

を呼び出すphtmlファイルとして <?php echo $this->getPagerHtml(); ?>

役に立ちましたか?

解決

で利用するようにして addExpressionFieldToSelect.
きの方法 Mage_Core_Model_Resource_Db_Collection_Abstract.
お場合もこのように:(このは想を頂く場合がございボディーにより若干の誤差が生じ、そのアイデアはok)

$collection = Mage::getModel('module/module')->getCollection()->addFieldToFilter('status',1);
$collection->addExpressionFieldToSelect('distance', '( 6371 * acos( cos( radians(23.0130648) ) * cos( radians( {{latitude}}) ) * cos( radians( {{longitude}}) - radians(72.4909026) ) + sin( radians(23.0130648) ) * sin( radians( {{latitude}}) ) ) )', array('latitude'=>'latitude', 'longitude'=>'longitude'));
$collection->getSelect()->having('distance > 10');

addExpressionFieldToSelect 作品のようになります:
最初のパラメータのエイリアスの仮想フィールド名).
第二のパラメータが異なるアイコンで表示されます。置換のフィールド名のフィールドとプレースホルダに包まれarround {{...}}
第三パラメータはプレースホルダー対応な {{}}).お場合 latitide プレースホルダーに対応する latitude{{latitude}} が取得できることを条件として latitude.じ longitude.

[編集]
ある問題を追加する場合にページングの $collection このような

$collection->setCurPage(1)->setPageSize(5);  

ここでは印刷の課題です。るものは、コンが読み込まれこれ _renderLimit().の方法のようになります

protected function _renderLimit()
{
    if($this->_pageSize){
        $this->_select->limitPage($this->getCurPage(), $this->_pageSize);
    }

    return $this;
}

この電話 getCurPage() 参照 Varien_Data_Collection を行っています。-
getCurPage は、追加の検証が、ページ番号がない外部の最大範囲で計算を行い、総ページ数 getLastPageNumber().
ここでの問題は、ざをリセットの列の選択のための計算コレクションのサイズ.に Varien_Data_Collection_Db::getSelectCountSql あります:

$countSelect->reset(Zend_Db_Select::COLUMNS);

によるresetingの列だと思いますこのsql

SELECT COUNT(*) FROM `table_name_here` AS `main_table` HAVING (distance < 10)

このエラーになります。

見る2つのオプションです。

  1. きのオーバーライドのコレクションクラスの方法 getSelectCountSql を取り外しカラムのリセット

    public function getSelectCountSql()
    {
        $this->_renderFilters();
    
        $countSelect = clone $this->getSelect();
        $countSelect->reset(Zend_Db_Select::ORDER);
        $countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
        $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
        //$countSelect->reset(Zend_Db_Select::COLUMNS);//comment this line
    
        $countSelect->columns('COUNT(*)');
    
        return $countSelect;
    }
    
  2. オーバーライドする getCurPage() 方法をスキップの検証:

    public function getCurPage($displacement = 0){
        if (!empty($this->_curPage)){
            return $this->_curPage + $displacement;
        }
        return 1;
    }
    

[編集]
な影響を及ぼすのモジュールをオーバーライドすることができ getCurPage 法のようになります:

public function getCurPage($displacement = 0){
    if (!$this->getDirectCurPage()){//if a specific flag is not set behave as default
        return parent::getCurPage($displacement);
    }
    if (!empty($this->_curPage)){
        return $this->_curPage + $displacement;
    }
    return 1;
}

現在を使用する場合にお having メソッドを追加することのできる収

$collection->setDirectCurPage(1);

他のヒント

代わりにこれを使用してみてください:

$collection = Mage::getModel('module/module')->getCollection()->addFieldToFilter('status',1);
            $collection->getSelect()->columns(array('distance' => new Zend_Db_Expr("( 6371 * acos( cos( radians(23.0130648) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians(72.4909026) ) + sin( radians(23.0130648) ) * sin( radians( latitude ) ) ) )")))
            ->addAttributeHaving('distance <10')
            ->addAttributeToSort('distance', Varien_Db_Select::SQL_ASC);

試してみることができます where() それ以外の having() あなたは何も使わないので JOIN ステートメント:

$collection->getSelect()->where('distance > ?', 10);
ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top