Joomlaデータベース-getQueryでLIMITを使用する方法
Joomla組み込みデータベースクラスを使用して、以下のクエリを作成したいと思います。
SELECT *
FROM table_name
ORDER BY id DESC
LIMIT 1
これは私が今までに作成したクエリです。
$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->nameQuote('*'));
$query->from($db->nameQuote(TABLE_PREFIX.'table_name'));
$db->setQuery($query);
$rows = $db->loadObjectList();
クエリに制限(LIMIT 1)を追加する方法がわかりません。誰か私にそれを行う方法を教えてもらえますか?ありがとう
Joomla 3.0より古い
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*')
->from($db->nameQuote('#__table_name'))
->order($db->nameQuote('id').' desc');
$db->setQuery($query,0,1);
$rows = $db->loadObjectList();
$db->setQuery
関数は3つのパラメーターを取ります。最初はクエリ、次に開始、次に制限です。上記のようにレコードを制限できます。
Joomla 3.0より新しい
setLimit(integer $limit, integer $offset)
1行だけが必要な場合
$query->setLimit(1);
これもうまくいくはずです:
$query->setLimit(1);
ドキュメント: http://api.joomla.org/cms-3/classes/JDatabaseQueryLimitable.html
Joomla 3.4.xではSetLimitが機能しないため、以下を試してください。
モデル内:
protected function getListQuery()
{
// Create a new query object.
$db = JFactory::getDBO();
$query = $db->getQuery(true);
// Select some fields
$query->select('*');
$query->from('#__your_table');
$this->setState('list.limit', 0); // 0 = unlimited
return $query;
}
モデルがgetItemsを呼び出す前にそれを実行すると、すべてのアイテムが読み込まれます。
これに関するいくつかの警告。
モデルの外でこれを行うこともできるので、たとえば、ビュー内にいた場合。次のことができます。
$ model = $ this-> getModel(); $ model-> setState( 'list.limit'、0);
場合によっては、モデルの状態が入力される前にこれを行うのが早すぎる可能性があります。これにより、制限を設定した後、基本的に制限をオーバーライドした後、モデルがユーザーの状態から再構築されます。
これを修正するには、最初にモデルにその状態を入力させることができます。
$ model = $ this-> getModel(); $ model-> getState(); $ model-> setState( 'list.limit'、0);実際のPopulateStateメソッドは保護されているため、モデルの外部では直接呼び出すことはできませんが、getStateを呼び出すと、populateStateが呼び出されてから状態の現在の設定が返されます。
更新:この答えを再検討する必要がありました、そして私は確認できます。両方の方法setLimit
とorder
が機能しています以下のように使用した場合。
$query->order($db->qn($data->sort_column_name) . ' ' . $data->sort_column_order);
$query->setLimit($length,$start);
古い回答
2014年9月8日現在@Dasunまたは@escopeczからの解決策は、J3.xで機能している
しかし、この古いトリックは私にとってはうまくいきます、それはニースです、
$query->order($db->qn('id') . ' DESC LIMIT 25');
そして、あなたが を1行だけフェッチしたいという特定の要件について 使用できます:
$rows = $db->loadObject();