2017-01-16 6 views
1

私はYii2で作成したアプリケーションのインデックスページに配置するために、「次の予定表」アイテムを作成しようとしています。Yii2 NOW()に基づくアイテムを表示すると、その日が表示されません

以下の機能を使用して、データベース内の次回のアイテムを検索し、出張と日付のクラスに基づいて表示します。私はNOW()式を使用しています。

しかし、これは次の今後のアイテムがNOW()の日付に達するまで表示されるため、その日には表示されなくなります。理想的には、時間が$ this->時間を過ぎるまで表示するか、またはNOW()の後の1日後にそのアイテムだけを表示するまで、今後のアイテムを表示するのが理想的です。

誰でもどのようなヒントを私はこれを達成することができますか?

public function searchANext($params) 
{ 
    $query = Trip::find(); 
    $time = new Expression('NOW()'); 
    $query->where(['class' => Trip::CLASS_A]) 
     ->andWhere(['>=', 'date', $time]) 
     ->limit(1); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
     'sort' => ['defaultOrder' => ['date' => SORT_ASC]], 
     'pagination' => false 
    ]); 

    if (!($this->load($params) && $this->validate())) { 
     return $dataProvider; 
    } 

    return $dataProvider; 
} 
+0

私はあなたのコードにいくつかの変更を加え示唆しますか? – marche

答えて

2

あなたが単一のレコードだけを取得したいときにActiveDataProviderを戻ってきている理由を私は知らない、それは私の意見では、この場合には不要です。

はまた、あなたが$paramsをロードし、クエリを作成した後、モデルを検証するので、$paramsが有効でない場合、あなたはまだエラーを取得すると、あなたが最終的にどんな負荷を$dataProviderを返さないとメソッドが返す検証されています。なぜあなたは `ActiveDataProvider`を使用している、あなただけの1つのレコードを表示したい場合は

public function searchANext($params) 
{ 
    // Try to load $params and validate the model first and return false 
    // instead of returning the result of the search. 
    if(!($this->load($params) && $this->validate())) { 
     return false; 
    } 

    // Let's get the currend DateTime. You might need to change this 
    // depending on the format of the 'date' field from 'Trip' 
    $now = date('Y-m-d H:i:s'); 

    // Instead of creating an ActiveDataProvider, you can just get the one 
    // record directly and return it. 
    $model = Trip::find() 
     ->where(['class' => Trip::CLASS_A]) 
     ->andWhere(['>=', 'date', $now]) 
     ->orderBy('date ASC') 
     ->one(); 

    return $model; 
} 
+0

ご回答いただきありがとうございます。その良い発言。私は少し急いで、一般的な検索機能をコピーして編集しました。しかし、私のスキルはまだ限られているので、説明に感謝します。私はできるだけ早くそれをチェックします。ありがとう! – Jay

関連する問題