今天我们来说一下laravel框架里最常用的数据库模型操作,特别是功能复杂的应用程序, 往往会拆分出许多的业务表,关联表,在时间和空间上进行权衡。
那么今天的问题是,如何关联3张表进行操作?
假设现在有3张表,分别是 articles 文章表,category 分类表,还要一个是 users 用户表。关联度最深的还数 articles,因为它要存储该文章的分类,还有发布者。字段如下:
id
title
body
categories_id
user_id
为了说明问题,我们精简了表结构。接着是 分类表 category 的字段:
id
category_name
最后是发布者 users 表字段:
id
user_name
user_type
好了准备工作做完了。假设要查询一篇文章,且需要连带查询出该文章的分类信息,发布者信息,最直观的是使用 join 关联查询。类似下面的代码方式:
$articles =DB::table('articles')
->join('categories', 'articles.id', '=', 'categories.id')
->join('users', 'users.id', '=', 'articles.user_id')
->select('articles.id','articles.title','articles.body','users.username', 'category.name')
->get();
但是这样写组装的SQL语句太复杂了。而且一点也不laravel。所以我们尝试着使用laravel eloquent orm 方式实现。
首先是创建表对应的模型 User.php,
<?php
namespace App\Model;
use Lib\Database\Model;
use App\Model\User;
use App\Model\Category;
class Article extends Model{
protected $table = 'articles';
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function category()
{
return $this->belongsTo(Category::class, 'category_id', 'id');
}
}
再接着是 User 用户模型:
<?php
namespace App\Model;
use Lib\Database\Model;
use App\Model\Article;
class User extends Model
{
protected $table = 'users';
public function articles()
{
return $this->hasMany(Article::class, 'user_id', 'id');
}
}
最后是分类 Category 模型: