私はYiiフレームワークのデータベース内の前のIDレコードを、次と後ろに移動するには&が必要ですか?Yiiのデータベースに次と前のIDレコードを取得
答えて
私はあなたが探しているそれらのIDを取得する機能を作った。私はあなたがモデルでそれを宣言することをお勧め:それは、次または前のレコードの対応するIDを返します
YourModel::getNextOrPrevId($id /*(current id)*/, "prev" /*(or "next")*/);
:
public static function getNextOrPrevId($currentId, $nextOrPrev)
{
$records=NULL;
if($nextOrPrev == "prev")
$order="id DESC";
if($nextOrPrev == "next")
$order="id ASC";
$records=YourModel::model()->findAll(
array('select'=>'id', 'order'=>$order)
);
foreach($records as $i=>$r)
if($r->id == $currentId)
return isset($records[$i+1]->id) ? $records[$i+1]->id : NULL;
return NULL;
}
だから、それを使用するためにあなたがしなければならないすべてはこれです。
私はそれを試していませんでしたので、試してみて、何かがうまくいかない場合は教えてください。
他の機能に情報を渡すためのプライベートvarを作成します。モデルで
:
class Model1 .....
{
...
private _prevId = null;
private _nextId = null;
...
public function afterFind() //this function will be called after your every find call
{
//find/calculate/set $this->_prevId;
//find/calculate/set $this->_nextId;
}
public function getPrevId() {
return $this->prevId;
}
public function getNextId() {
return $this->nextId;
}
}
がViewDetalリンクで生成されたコードを確認し、配列( 'ID' =に
$model(or $data)->prevId/nextId
を使用して_VIEWファイルの中前/ネットリンクについて修正>#)セクション。
私はYii2の私のモデルでは、以下の機能を追加しました:
public function getNext() {
$next = $this->find()->where(['>', 'id', $this->id])->one();
return $next;
}
public function getPrev() {
$prev = $this->find()->where(['<', 'id', $this->id])->orderBy('id desc')->one();
return $prev;
}
これまでのところ最良の答えです。ほとんどの人は - > all()を使用しますが、リソースIMOの無駄です。 – vanarie
を元の答えを取り、少しのクリーンアップとYii2のためにそれを適応:
/**
* [nextOrPrev description]
* @source http://stackoverflow.com/questions/8872101/get-next-previous-id-record-in-database-on-yii
* @param integer $currentId [description]
* @param string $nextOrPrev [description]
* @return integer [description]
*/
public static function nextOrPrev($currentId, $nextOrPrev = 'next')
{
$order = ($nextOrPrev == 'next') ? 'id ASC' : 'id DESC';
$records = \namespace\path\Model::find()->orderBy($order)->all();
foreach ($records as $i => $r) {
if ($r->id == $currentId) {
return ($records[$i+1]->id ? $records[$i+1]->id : NULL);
}
}
return false;
}
とき、以前のソリューションは問題があります最初または最後のレコードを取得し、データベースへの複数の呼び出しを行っています。ここでは1つのクエリで動作し、私の作業溶液は、エンド・オブ・テーブルを処理し、エンド・オブ・テーブルにあるボタンを無効にします。
public static function NextOrPrev($currentId)
{
$records = <Table>::find()->orderBy('id DESC')->all();
foreach ($records as $i => $record) {
if ($record->id == $currentId) {
$next = isset($records[$i - 1]->id)?$records[$i - 1]->id:null;
$prev = isset($records[$i + 1]->id)?$records[$i + 1]->id:null;
break;
}
}
return ['next'=>$next, 'prev'=>$prev];
}
コントローラ内::
モデル内ビュー内
public function actionView($id)
{
$index = <modelName>::nextOrPrev($id);
$nextID = $index['next'];
$disableNext = ($nextID===null)?'disabled':null;
$prevID = $index['prev'];
$disablePrev = ($prevID===null)?'disabled':null;
// usual detail-view model
$model = $this->findModel($id);
return $this->render('view', [
'model' => $model,
'nextID'=>$nextID,
'prevID'=>$prevID,
'disableNext'=>$disableNext,
'disablePrev'=>$disablePrev,
]);
}
:
<?= Html::a('Next', ['view', 'id' => $nextID], ['class' => 'btn btn-primary r-align btn-sm '.$disableNext]) ?>
<?= Html::a('Prev', ['view', 'id' => $prevID], ['class' => 'btn btn-primary r-align btn-sm '.$disablePrev]) ?>
私の実装はSearchModelに基づいています。
コントローラー:
public function actionView($id)
{
// ... some code before
// Get prev and next orders
// Setup search model
$searchModel = new OrderSearch();
$orderSearch = \yii\helpers\Json::decode(Yii::$app->getRequest()->getCookies()->getValue('s-' . Yii::$app->user->identity->id));
$params = [];
if (!empty($orderSearch)){
$params['OrderSearch'] = $orderSearch;
}
$dataProvider = $searchModel->search($params);
$sort = $dataProvider->getSort();
$sort->defaultOrder = ['created' => SORT_DESC];
$dataProvider->setSort($sort);
// Get page number by searching current ID key in models
$pageNum = array_search($id, array_column($dataProvider->getModels(), 'id'));
$count = $dataProvider->getCount();
$dataProvider->pagination->pageSize = 1;
$orderPrev = $orderNext = null;
if ($pageNum > 0) {
$dataProvider->pagination->setPage($pageNum - 1);
$dataProvider->refresh();
$orderPrev = $dataProvider->getModels()[0];
}
if ($pageNum < $count) {
$dataProvider->pagination->setPage($pageNum + 1);
$dataProvider->refresh();
$orderNext = $dataProvider->getModels()[0];
}
// ... some code after
}
OrderSearch:
public function search($params)
{
// Set cookie with search params
Yii::$app->response->cookies->add(new \yii\web\Cookie([
'name' => 's-' . Yii::$app->user->identity->id,
'value' => \yii\helpers\Json::encode($params['OrderSearch']),
'expire' => 2147483647,
]));
// ... search model code here ...
}
PS:あなたは、オブジェクトの配列のarray_column
を使用できるかどうかを確認してください。 これはPHP 7+でうまくいきますが、下位バージョンでは自分でid
を抽出する必要があります。おそらく、array_walk
またはarray_filter
をPHP 5で使用することをお勧めします。4+
- 1. SQL - 次のXレコードと前のXレコードを取得する
- 2. Rails:次/前のレコードを取得
- 3. YiiのレコードIDを選択
- 4. yiiの今日の日付から次の10日間のレコードを取得
- 5. - > ID、名前、Roll_Number - Yiiの
- 6. データベースからビューに次のレコードを取得する
- 7. レコードの名前をとってデータベースにレコードIDを保存する方法
- 8. yii2 - データベースのIDの代わりに名前を取得
- 9. ページ内のssrsレポートの前、現在、次のレコードを取得
- 10. 前と次の値のカウントを取得
- 11. $ _SESSIONからデータベースに著者のIDと名前を取得するには?
- 12. データベースからレコードIDの配列を取得した複数のレコードを効率的に読み取る
- 13. ボタンをクリックすると、SQLiteデータベースから次のレコードを取得します
- 14. Javascriptで次と前のMongoDBを取得
- 15. paper_trailを使用してバージョンIDの次のバージョンと前のバージョンを取得
- 16. 現在のIDから前の行と次の行を取得する
- 17. Yiiデータプロバイダからn個のレコードを取得する方法は?
- 18. Linq次のnレコードを取得
- 19. 次のレコードを取得する
- 20. データベース内の特定のIDのレコードの量を取得する方法は?
- 21. ruby on railsで以前のレコードと次のレコードの値を取得する方法
- 22. レコードを取得せずにbelongsTo IDを取得
- 23. 前年のレコードを取得するMySQL
- 24. 次のアクションでYARNアクションアプリケーションIDを取得
- 25. 新しいSQLレコードIDを取得
- 26. 次のレコードと前のレコードを非ユニークフィールドで並べ替える
- 27. データベース内のテーブルからIDを取得
- 28. JAVA:データベース項目のIDを取得
- 29. 次回/前回のレコードを取得するためのAndroid next/backボタン
- 30. アイテムがコミットされる前に次のコミットIDを取得できますか?
" class="dBlock left">Next – Abudayah
と私はPhotoController – Abudayah
致命的なエラーでその関数を書く:未定義のメソッドの写真:: getPrevOrNextId(の呼び出し) – Abudayah