zoukankan      html  css  js  c++  java
  • Eloquent ORM 之关联查询

      小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记

      前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自己封装,接下来我们就一起研究Eloquent的关联是如何应用的。

      

      1.创建Models

      前一篇文章创建了UserModel,其实对于users_ext也可以创建一个Model:  UserExtModel.php  

    <?php
    
    class UserExtModel extends Eloquent  {
    
        protected $table = 'users_ext';
        protected $primaryKey = 'iAutoId';
        protected $connection = 'user';
    
        public function user() {
            return $this->belongsTo('UserModel','iUserID','iAutoId');
        }
    }

        

      2.建立关联

      修改UserModel.php,在文件中添加和users_ext的一对一关联。

     1 <?php
     2 
     3 class UserModel extends Eloquent  {
     4 
     5     protected $table = 'users';
     6     protected $primaryKey = 'iAutoId';
     7     protected $connection = 'user';
     8 
     9     public function userExt(){
    10         return $this->hasOne('UserExtModel','iUserID','iAutoId');
    11     }
    12 }

      3.关联查询

      (1)一对一关联:

      上面两个Models利用hasOne()和belongsTo()方法建立的关联模型正是“一对一”模型,现在就可以做出简单的查询:  

     1 <?php
     2 
     3 class HomeController extends BaseController {
     4 
     5     public function getUsers(){
     6         $resData = UserModel::find(1)->userExt->toArray();
     7         var_dump($resData);
     8         exit();
     9     }
    10 }

      以上查询相当于sql语句:

    1 SELECT
    2     users_ext.*
    3 FROM
    4     users
    5 LEFT JOIN users_ext ON users.iAutoId = users_ext.iUserID
    6 WHERE
    7     users_ext.iUserID = 1

      

      (2)一对多关联:

      将UserModel模型中hasOne()改为hasMany(),这样就建立了"一对多"的关联模型,现在可以做以下简单查询:  

     1 <?php
     2 
     3 class HomeController extends BaseController {
     4 
     5     public function getUsers(){
     6         $resData = UserModel::find(1)->userExt()->where('sSex','=',1)->get()->toArray();
     7         var_dump($resData);
     8         exit();
     9     }
    10 }

      

      以上查询相当于sql语句:  

    1 SELECT
    2     users_ext.*
    3 FROM
    4     users
    5 LEFT JOIN users_ext ON users.iAutoId = users_ext.iUserID
    6 WHERE
    7     users.iAutoId = 1
    8 AND users_ext.sSex = 1

      

      (3)多对多关联:

      这个模型相对复杂,就以用户和角色的关系来说明。需要另外创建roles和user_role两张表,并初始化:  

     1 CREATE TABLE
     2 IF NOT EXISTS roles (
     3     iAutoId INT (11) auto_increment,
     4     sRoleName VARCHAR (20),
     5     PRIMARY KEY (iAutoId)
     6 ) ENGINE = INNODB DEFAULT CHARSET = utf8 auto_increment = 1;
     7 
     8 INSERT INTO roles (sRoleName)
     9 VALUES
    10     ('admin'),
    11     ('root');
    12 
    13 CREATE TABLE
    14 IF NOT EXISTS user_role (
    15     iAutoId INT (11) auto_increment,
    16     iUserID INT (11),
    17     iRoleID INT (11),
    18     PRIMARY KEY (iAutoId)
    19 ) ENGINE = INNODB DEFAULT CHARSET = utf8 auto_increment = 1;
    20 
    21 INSERT INTO user_role (iUserID, iRoleID)
    22 VALUES
    23     (1, 1),
    24     (1, 2),
    25     (2, 1),
    26     (3, 2),
    27     (3, 1);

      紧接着就可以建立RoleModel了: 

    1 <?php
    2 
    3 class RoleModel extends Eloquent  {
    4 
    5     protected $table = 'roles';
    6     protected $primaryKey = 'iAutoId';
    7     protected $connection = 'user';
    8 }

      然后在UserModel中创建“多对多”关联关系:  

     1 <?php
     2 
     3 class UserModel extends Eloquent  {
     4 
     5     protected $table = 'users';
     6     protected $primaryKey = 'iAutoId';
     7     protected $connection = 'user';
     8 
     9     public function roles(){
    10         return $this->belongsToMany('RoleModel','user_role','iUserID','iRoleID');
    11     }
    12 }

      

       接下来就实现查询了:  

     1 <?php
     2 
     3 class HomeController extends BaseController {
     4 
     5     public function getUsers(){
     6         
     7         $resData = UserModel::find(1)->roles;
     8         var_dump($resData->toArray());
     9         exit();
    10     }
    11 }

      

      以上查询结果为:

      

      

      好吧,这里只是简单学习了下,还有更复杂的需要小伙伴们自己查看API

      

  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/brudeke/p/4228848.html
Copyright © 2011-2022 走看看