Maison > cadre php > YII > le corps du texte

Comment interroger des données dans yii2

爱喝马黛茶的安东尼
Libérer: 2019-12-09 14:17:25
original
4252 Les gens l'ont consulté

Comment interroger des données dans yii2

Requête de données

User::find()->all();    此方法返回所有数据;
User::findOne($id);   此方法返回 主键 id=1  的一条数据(举个例子); 
User::find()->where(['name' => '小伙儿'])->one();   此方法返回 ['name' => '小伙儿'] 的一条数据;
User::find()->where(['name' => '小伙儿'])->all();   此方法返回 ['name' => '小伙儿'] 的所有数据;
User::find()->orderBy('id DESC')->all();   此方法是排序查询;
User::findBySql('SELECT * FROM user')->all();  此方法是用 sql  语句查询 user 表里面的所有数据;
User::findBySql('SELECT * FROM user')->one();  此方法是用 sql  语句查询 user 表里面的一条数据;
User::find()->andWhere(['sex' => '男', 'age' => '24'])->count('id');   统计符合条件的总条数;
User::find()->one();    此方法返回一条数据;
User::find()->all();    此方法返回所有数据;
User::find()->count();    此方法返回记录的数量;
User::find()->average();    此方法返回指定列的平均值;
User::find()->min();    此方法返回指定列的最小值 ;
User::find()->max();    此方法返回指定列的最大值 ;
User::find()->scalar();    此方法返回值的第一行第一列的查询结果;
User::find()->column();    此方法返回查询结果中的第一列的值;
User::find()->exists();    此方法返回一个值指示是否包含查询结果的数据行;
User::find()->batch(10);  每次取 10 条数据 
User::find()->each(10);  每次取 10 条数据, 迭代查询
Copier après la connexion

Requête multi-table :

/* 多表联查 */
$model=new Customer();
$model->fiind()->join(‘LEFT JOIN‘,‘student‘,‘student.cid=customer.id‘)
            ->where(‘student.id‘=>\Yii::$app->user->id)
            ->andwhere(‘is_ok=1‘)
            ->one()
Copier après la connexion

Requête associée

En utilisant la méthode AR, vous pouvez également interrogez la table de données Données associées (par exemple, la sélection de données dans la table A peut extraire les données associées de la table B). Avec AR, la jointure des données associées renvoyée revient à joindre les propriétés de l'objet AR à la table principale associée.

Après avoir établi l'association, vous pouvez obtenir un tableau d'objets Order via $customer->orders, qui représente l'ensemble de commandes de l'objet client actuel.

Définissez l'association à l'aide d'une méthode getter qui renvoie un objet [[yiidbActiveQuery]]. L'objet [[yiidbActiveQuery]] contient des informations sur le contexte associé, vous ne pouvez donc interroger que les données associées.

class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        // 客户和订单通过 Order.customer_id -> id 关联建立一对多关系
        return $this->hasMany(Order::className(), ['customer_id' => 'id']);
    }
}
 
class Order extends \yii\db\ActiveRecord
{
    // 订单和客户通过 Customer.id -> customer_id 关联建立一对一关系
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}
Copier après la connexion

Ce qui précède utilise les méthodes [[yiidbActiveRecord::hasMany()]] et [[yiidbActiveRecord::hasOne()]]. Les deux exemples ci-dessus sont des exemples de modélisation de relations plusieurs-à-un et de relations un-à-un dans les données associées respectivement. Par exemple, un client a plusieurs commandes et une commande n’appartient qu’à un seul client. Les deux méthodes ont deux paramètres et renvoient des objets [[yiidbActiveQuery]].

Après avoir établi l'association, obtenir les données associées est aussi simple que d'obtenir les attributs du composant. Il suffit d'exécuter la méthode getter correspondante suivante :

// 取得客户的订单
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders 是 Order 对象数组
Copier après la connexion

Le code ci-dessus exécute en fait les deux instructions SQL suivantes :

SELECT * FROM customer WHERE id=1;
SELECT * FROM order WHERE customer_id=1;
Copier après la connexion

Parfois, il est nécessaire de transmettre des paramètres dans les requêtes associées. Si vous n'avez pas besoin de renvoyer toutes les commandes du client, il vous suffit de renvoyer les commandes importantes dont les montants d'achat dépassent la valeur définie. via la méthode getter suivante :

class Customer extends \yii\db\ActiveRecord
{
    public function getBigOrders($threshold = 100)
    {
        return $this->hasMany(Order::className(), ['customer_id' => 'id'])
            ->where('subtotal > :threshold', [':threshold' => $threshold])
            ->orderBy('id');
    }
}
Copier après la connexion

Union Query

Lors de l'utilisation d'une base de données relationnelle, ce qui est généralement fait est de joindre plusieurs tables et explicitement appliquer diverses requêtes JOIN. Pour les conditions de requête et les paramètres de l'instruction SQL JOIN, utilisez [[yiidbActiveQuery::joinWith()]] pour réutiliser la relation définie et appelez au lieu d'utiliser [[yiidbActiveQuery::join()]] pour atteindre l'objectif.

// 查找所有订单并以客户 ID 和订单 ID 排序,并贪婪加载 "customer" 表
$orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
// 查找包括书籍的所有订单,并以 `INNER JOIN` 的连接方式即时加载 "books" 表
$orders = Order::find()->innerJoinWith('books')->all();
Copier après la connexion

La méthode ci-dessus [[yiidbActiveQuery::innerJoinWith()|innerJoinWith()]] consiste à accéder au type INNER JOIN [[yiidbActiveQuery::joinWith()

|joinWith()] ] raccourci.

Vous pouvez connecter une ou plusieurs relations associées, vous pouvez utiliser librement les conditions de requête pour les requêtes associées et vous pouvez également imbriquer des requêtes associées connectées. Par exemple :

// 连接多重关系
// 找出24小时内注册客户包含书籍的订单
$orders = Order::find()->innerJoinWith([
    'books',
    'customer' => function ($query) {
        $query->where('customer.created_at > ' . (time() - 24 * 3600));
    }
])->all();
// 连接嵌套关系:连接 books 表及其 author 列
$orders = Order::find()->joinWith('books.author')->all();
Copier après la connexion

Derrière le code, Yii exécute d'abord une instruction JOIN SQL pour connaître les principaux modèles qui répondent aux conditions de requête de l'instruction JOIN SQL, puis exécute une instruction de requête pour chaque relation, et bing remplit dans les enregistrements associés correspondants.

La différence entre [[yiidbActiveQuery::joinWith()|joinWith()]] et [[yiidbActiveQuery::with()|with()]] est que le premier connecte les tables de données du modèle principal class et la classe de modèle associée pour récupérer le modèle principal, tandis que cette dernière interroge et récupère uniquement les classes de modèle principales. Récupérez le modèle principal

En raison de cette différence, vous pouvez appliquer des conditions de requête qui ne fonctionnent que sur une instruction JOIN SQL. Par exemple, filtrez le modèle principal à travers les conditions de requête du modèle associé. Comme dans l'exemple précédent, vous pouvez utiliser les colonnes de la table associée pour sélectionner les données du modèle principal

Lors de l'utilisation de [[yiidbActiveQuery. ::joinWith()|joinWith()]] peut répondre à des noms de colonnes sans ambiguïté. Dans les exemples ci-dessus, nous utilisonsitem.id et order.id pour lever l'ambiguïté sur les références de la colonne id car la table order et la table items incluent la colonne id.

Lors de la connexion à une association, l'association utilise par défaut le chargement instantané. Vous pouvez décider d'utiliser le chargement hâtif dans la requête associée spécifiée en passant le paramètre $eagerLoading.

Par défaut [[yiidbActiveQuery::joinWith()|joinWith()]] utilise la jointure gauche pour joindre les tables associées. Vous pouvez également transmettre le paramètre $joinType pour personnaliser le type de jointure. Vous pouvez également utiliser [[yiidbActiveQuery::innerJoinWith()|innerJoinWith()]].

Paging Yii2

N'importe quelle méthode dans le CommentController, ici ma méthode est actionComment();

use yii\data\Pagination;
use app\models\Comment;
  public function actionComment(){
       $data = Comment::find()->andWhere(['id' => '10']);
       $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '2']);
       $model = $data->offset($pages->offset)->limit($pages->limit)->all();
       
       return $this->render('comment',[
             'model' => $model,
             'pages' => $pages,
       ]);
  }
Copier après la connexion

afficher le code à l'intérieur

<?php
use yii\widgets\LinkPager;
?>
      foreach($model as $key=>$val)
      {
           这里就是遍历数据
      }
      <?= LinkPager::widget([&#39;pagination&#39; => $pages]); ?>
Copier après la connexion

Opération in()

SELECT * FROM `categ_price` WHERE `id` IN (9, 11)

$categ_price_id=[9>1,11=>3]
  $categPriceModel= \common\models\CategPrice::find()->where([&#39;id&#39; =>array_keys($categ_price_id)])->all();
  #>where([&#39;id&#39; => [1, 2, 3]])
Copier après la connexion

pas opération in()

SELECT * FROM `shop` WHERE (status=1) AND (`id` NOT IN (88, 93))

$shopModel= Shop::find()->where(&#39;status=1&#39;)->andWhere([&#39;not in&#39;,&#39;id&#39;,[88,98]])->all();
Copier après la connexion

Le site Web chinois PHP a un un grand nombre de tutoriels d'introduction à Yii gratuits, tout le monde est invité à apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!