Une date peut être représentée dans différents formats. Une table elle-même ressemble à ceci:
book varchar(250) NOT NULL,
date INT NOT NULL
Maintenant, mon problème est que je ne peux pas implémenter la recherche dans une plage entre deux dates. Par exemple, il existe 5 livres avec des dates différentes, mais la date de début commence à 31/12/14
et la date finale est 31/02/15
. Ainsi, lorsqu'un utilisateur sélectionne une plage entre ces dates, il doit fournir tous les livres de cette plage de dates.
Est-il possible de le faire en Yii2? Je n'ai rien trouvé jusqu'ici
METTRE À JOUR
J'implémente un filtre personnalisé qui n'appartient pas à GridView
et qui ressemble à une boîte autonome en dehors de la table.
Cela ressemble à ceci:
<div class="custom-filter">
Date range:
<input name="start" />
<input name="end" />
Book name:
<input name="book" />
</div>
Je crois que c'est la réponse dont vous avez besoin:
$model = ModelName::find()
->where(['between', 'date', "2014-12-31", "2015-02-31" ])->all();
Si vous commencez et terminez au format de date, mais que la date dans votre table de base de données est de type INT, vous devez procéder comme suit:
//Get values and format them in unix timestamp
$start = strtotime(Yii::$app->request->post('start'));
$end = strtotime(Yii::$app->request->post('end'));
//Book name from your example form
$bookName = Yii::$app->request->post('book');
//Then you can find in base:
$books = Book::find()
->where(['between', 'date', $start, $end])
->andWhere(['like', 'book', $bookName])
->all();
N'oubliez pas de valider les valeurs données par la poste.
En supposant que la date stockée sous forme d’entier représente l’horodatage Unix, vous pouvez créer une classe de modèle et appliquer les attributs yii\validators\DateValidator on start
et end
.
/**
* Class which holds all kind of searchs on Book model.
*/
class BookSearch extends Book
{
// Custom properties to hold data from input fields
public $start;
public $end;
/**
* @inheritdoc
*/
public function rules()
{
return [
['start', 'date', 'timestampAttribute' => 'start', 'format' => 'php:d/m/y'],
['end', 'date', 'timestampAttribute' => 'end', 'format' => 'php:d/m/y']
];
}
public function searchByDateRange($params)
{
$this->load($params);
// When validation pass, $start and $end attributes will have their values converted to unix timestamp.
if (!$this->validate()) {
return false;
}
$query = Book::find()->andFilterWhere(['between', 'date', $this->start, $this->end]);
return true;
}
}
Plus d’informations sur timestampAttribute
sur cette documentation .
utilisez Yii2 Active Record et accédez aux livres entre deux dates comme celle-ci.
public static function getBookBetweenDates($lower, $upper)
{
return Book::find()
->where(['and', "date>=$lower", "date<=$upper"])
->all();
}
Je suppose que vous utilisez une classe d'enregistrement active et que vous avez créé Book.php (nom approprié basé sur le nom de la table) en tant que fichier modèle.