Laravel Model多表链接 联合查询 When查询

3 篇文章 0 订阅

laravel文档中model部分少得可怜  只能一点一点找资料慢慢摸索前行;

laravel查询数据库方式很多也很灵活, 个人爱好还是喜欢使用model看着比较整洁

DB类已经很完善了功能强大 具体使用方式:

DB::table('tablename')->get();

DB::table('tablename')->where('name','');

DB::table('tablename')->还有很多方法就不一一列举了

Model(Eloquent)使用方式:

简单使用超链接直接去laravel文档

Model连接查询

一对一关联

public function phone()
    {
        return $this->hasOne('需要关联的Model', '外表的关联字段(外键)', '本表的字段(主键)');
    }

一对多关联

public function comments()
    {
 return $this->hasMany('需要关联的Model', '外边中的关联字段(外键)', '本表中的关联字段(主键)');
    }

 这时出现一个问题BelongsTo也是,怎么使用和HasOne,HasMany有啥不一样

public function user()
    {
        return $this->belongsTo('需要关联的Model','自己的关联字段(外键)','外表的关联字段(主键)');
    }

通过laravel给的例子可以看出是有逻辑问题的

建表是会有一个主外键的问题  比如会员账号表(User)和会员信息表(UserData)

UserData中存User的主键作为User的外键u_id

这是两个表关系变成

User包含了UserData

UserData属于User的分表

这样在UserModel中关联规范使用HasOne

反之UserData表使用BelongsTo

多对一是不是也是一样的思路

模型关联查询使用方式 各种查询

一、简单的查询

    //连表查询操作
    public function scopeGetUserData($Query){
        return $Query
            ->with(['UserData'=>function($query){
                $query->select('u_id', 'u_name', 'u_sex');
                //一定注意关联的字段必须查询出来(外键)
            }]);
    }

一定注意 用来关联的字段一定要查询出来 否则结果为空

二、查询进阶过滤

 return $Query
            ->with(['User'=>function($query){
                $query->select('u_id', 'u_name');
            }])->whereHas('User', function ($query) use ($uname){
                if(!empty($uname)){
                    $query->where('u_name','like','%'.$uname.'%');
                }
            });
 return $Query
            ->with(['User'=>function($query){
                $query->select('u_id', 'u_name');
            }])->whereHas('User', function ($query) use ($uname){
                $query->when(!empty($uname),function($query) use ($uname){
                        $query->where('u_name','like','%'.$uname.'%');
                    });
            });

when用法参考文档

三、再进阶

 return $Query
            ->with(['User'=>function($query) use ( $aWhere) {
                $tel    = $aWhere['u_tel'];
                $query->select('u_id','u_name','u_tel');
                if($aWhere['res']['tel']){
                    $query->where('u_tel', $tel);
                }
                return $query;
            }]);

总结:Model使用起来新东西比较多 但是确实比较整洁 优雅的写开发代码

详情使用Model

在命令行运行下列语句创建两个Model

php artisan generate:model user
php artisan generate:model userdata

这个时候在app/models/下就出现了两个文件User.php和UserData.php

这是两个Model类,他们都继承了Laravel提供的核心类\Eloquent。详见Eloquent系列教程:深入理解Laravel Eloquent(一)--基本概念与用法

Laravel是一套简洁、优雅的PHP Web开发框架 (PHP Web Framework) 。在世界(不含中国)PHP框架的占有率超过40%。但是国内好像很少使用laravel

使用Yii和thinkPHP比较多,

感觉Yii实现功能比较简单,也是一个很不错的框架。

最近由于工作的原因开始研究Laravel,使用起来也很顺手虽然还没用到高阶只是在用皮毛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 Laravel 的 Eloquent ORM 和递归方法来实现多级父子表查询整合成树的功能。 首先,您需要定义您的模型,并且在模型中定义表的关系。假设您的表名为 `categories`,那么您的模型代码可能如下所示: ```php class Category extends Model { public function parent() { return $this->belongsTo(Category::class, 'parent_id'); } public function children() { return $this->hasMany(Category::class, 'parent_id'); } } ``` 在上面的代码中,我们定义了 `parent()` 方法和 `children()` 方法来表示当前分类的父分类和子分类,这里使用了 Laravel 的 Eloquent ORM 中的关系映射方法。 接下来,您可以编写一个递归方法来将您的分类表数据整合成树形结构。代码如下: ```php function buildTree($categories, $parentId = null) { $branch = []; foreach ($categories as $category) { if ($category->parent_id == $parentId) { $children = buildTree($categories, $category->id); if ($children) { $category->children = $children; } $branch[] = $category; } } return $branch; } ``` 在上面的代码中,我们使用了递归的方式,从顶级分类开始,递归地查询当前分类的子分类,并将它们整合成树形结构。 最后,您可以在控制器中调用这个方法,并将查询到的分类数据传递给它,代码如下: ```php use App\Models\Category; class CategoryController extends Controller { public function index() { $categories = Category::all(); $tree = buildTree($categories); return view('categories.index', ['categories' => $tree]); } } ``` 在上面的代码中,我们首先查询了所有的分类数据,然后调用 `buildTree()` 方法将分类数据整合成树形结构,并将整合后的数据传递给视图渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值