• 黑马lavarel教程---10、lavarel模型关联


    黑马lavarel教程---10、lavarel模型关联

    一、总结

    一句话总结:

    1、模型关联比较方便,一次定义,后面都可以使用
    2、关联关系 使用动态属性进行调用

    1、一对多,多对多实例?

    一对多:一篇文章有多个评论
    多对多:一个文章可能有多个关键词,一个关键词可能被多个文章使用。

    2、lavarel模型关联中关联代码是写在主模型中还是写在次模型中?

    关联代码写在主模型中
    谁是主模型谁是次模型根据实际需求进行分析,比如文章表和关键词表多对多关系,当要查所有文章对应的关键词的时候文章表就是主模型

    3、lavarel关联关系的方法名称一般是什么?

    被关联的模型名小写
    public function 被关联的模型名小写(){
        return $this -> hasOne(‘需要关联模型的命名空间’,’被关联模型的关系字段,’本模型中的关系字段’);
    } 

    4、lavarel模型中如何设置一对多模型中的外键字段?

    return $this->hasMany('AppComment', 'foreign_key', 'local_key');

    5、关联关系的使用方法?

    使用动态属性进行调用:$roles = AppUser::find(1)->roles()->orderBy('name')->get();
    <?php
    
    namespace App;
    use IlluminateDatabaseEloquentModel;
    class User extends Model
    {
        /**
         * 用户的角色
         */
        public function roles()
        {
            return $this->belongsToMany('AppRole');
        }
    }
    一旦关联关系被定义后,你可以通过 roles 动态属性获取用户角色:
    
    $user = AppUser::find(1);
    
    foreach ($user->roles as $role) {
        //
    }
    当然,像其它所有关联模型一样,你可以使用 roles 方法,利用链式调用对查询语句添加约束条件:
    
    $roles = AppUser::find(1)->roles()->orderBy('name')->get();

    二、lavarel模型关联

    关联模型就是绑定模型(表)的关系(关联表),后续需要使用联表的时候就可以直接使用关联模型。注意:关联模型必须要创建模型

    1、一对一关系

    例如:一篇文章只有一个作者

    ①创建模型【前提】

    #php artisan make:model Home/Article

    #php artisan make:model Home/Author

     

    ②定义基本的结构代码

     

     

    ③关联模型的关联方法(重点)

    注意:在写关联模型的时候要分析出是谁关联谁,谁做主动关联的模型?当前的案例是文章关联作者,需要关联代码写在主模型中

    语法:

             public function 被关联的模型名小写(){

                       return $this -> hasOne(‘需要关联模型的命名空间’,’被关联模型的关系字段,’本模型中的关系字段’);

    }

     

    关联关系的使用方法:使用动态属性进行调用

     

    案例:通过关联模型的一对一关系查询出每个文章对应的作者名称

    ①定义需要的路由

     

    ②创建需要的方法

     

    使用一对一关联关系之后,其可以替代之前写join联表操作。

    2、一对多关系

    例如:一篇文章有多个评论

    由于文章和评论的关系是一对多的关系,所以需要再去创建一个数据表(评论表):

    字段id                         主键

    字段comment             评论内容

    字段article_id             和文章的关系字段,文章id

    ①迁移文件的创建

    #php artisan make:migration create_comment_table

     

    ②编写迁移文件代码

     

    ③执行迁移文件生成数据表

    #php artisan migrate

     

    ④添加测试的评论内容

    a. 创建填充器文件

    #php artisan make:seeder CommentTableSeeder

     

    b. 编写填充器文件的代码

     

    c. 执行填充器文件

    #php artisan db:seed --class=CommentTableSeeder

     

    ⑤评论模型创建起来

    #php artisan make:model Home/Comment

     

    定义其基本的属性:

     

    案例:查询出每个文章(主)下所有的评论(从)。

    关联关系的编写:

    public function 被关联的模型名小写(){

                       return $this -> hasMany(‘需要关联模型的命名空间’,’被关联模型的关系字段,’本模型中的关系字段’);

    }

    与hasOne方法相比,其只是把方法名称做了变化,其他与之前一致。

     

    编写test22方法实现上述案例的要求:

    操作代码:

     

    效果:

     

    3、多对多关系

    例如:一个文章可能有多个关键词,一个关键词可能被多个文章使用。

     

    当点开关键词链接之后,会发现一个关键下能搜出很多文章。

    因此,文章和关键词之间是多对多的关系。

    对对多的关系经过拆分之后其实就是两个一对多的关系。由于是双向一对多的关系,因此光靠2张表是无法建立的关系的,需要依靠第三张表建立关系(xx与xx的关系表)。

    当前已经存在文章表,因此还需要关键词表和关系表。

    关键词表:

             字段id                        主键

             字段keyword           关键词

    文章与关键词的关系表:

             字段id                        主键

             字段article_id         文章id

             字段key_id               关键词id

    简易模拟:

    Id      关键词                                          id      文章id     关键词id

    1       芳华                                               1       1                1

    2       冯小刚                                          2       1                2

                                                                     3       2                1

    ①创建需要迁移文件

    #php artisan make:migration create_keyword_table

    #php artisan make:migration create_relation_table

     

    ②编写迁移文件的代码

     

     

    ③执行迁移文件生成数据表

    #php artisan migrate

     

    ④生成测试的数据

    #php artisan make:seeder KeywordAndRelationTableSeeder

     

    编写相关代码:

     

    执行填充器文件:

    #php artisan db:seed --class=KeywordAndRelationTableSeeder

     

    ⑤创建需要的模型

    注意:根据手册中记录的语法要求,不需要给关系表单独的创建模型

    该处只需要单独给keyword创建模型即可

    #php artisan make:model Home/Keyword

     

    定义模型的基本内部结构

     

    案例:查询出每个文章下全部的关键词

     

    语法:return $this -> belongsToMany(被关联模型的元素空间路径,多对多模型的关系表名,当前模型中的关系键,被关联模型的关系键);

    根据案例的要求,此处的关系映射依旧写在文章模型中

     

    编写test23方法,实现刚才案例的需要:

     

    显示效果:

     

     
  • 相关阅读:
    Eclipse查看某个方法被哪些类调用
    ServletContextListener的作用
    ServletContextListener使用详解(监听Tomcat启动、关闭)
    通用测试用例大全
    Spring常用注解汇总
    Spring @Lazy
    Qt 事件处理 快捷键(重写eventFilter的函数,使用Qt::ControlModifier判断)
    Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good
    delphi idhttp 实战用法(TIdhttpEx)
    delphi 线程教学第一节:初识多线程(讲的比较浅显),还有三个例子
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11579725.html
Copyright © 2020-2023  润新知