追加方法についての動的フざんあります。
-
16-10-2019 - |
質問
私が作成したざ回収このような計算からの距離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つのオプションです。
きのオーバーライドのコレクションクラスの方法
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; }
オーバーライドする
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);