通过模型关联操作把数据表的关联关系对象化,解决了大部分常用的关联场景,封装的关联操作比起常规的数据库联表操作更加智能和高效,并且直观。
避免在模型内部使用复杂的join查询和视图查询。
创建有关联的两个数据表
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章id',
`cateId` int(11) DEFAULT NULL COMMENT '文章分类id',
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '文章标题',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=36 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
创建article模型
namespace app\model;
use think\Model;
class Article extends Model
{
//一篇文章只有一个分类,文章对分类是一对一
public function category(){
return $this->hasOne("Category","id","cateId");
}
}
创建category模型
namespace app\model;
use think\Model;
class Category extends Model
{
//一个分类可以有多篇文章,分类对文章是一对多
public function article(){
return $this->hasMany("article","cateId","id");
}
}
控制器调用模型
namespace app\controller;
use app\model\Article;
use app\model\Category;
class Relation
{
//关联查询-find
public function find(){
$article = Article::with('category')->where("id","=","2")->find();
echo $article->title;
// 输出category关联模型的name属性
echo $article->category->name;
}
//关联查询-select
public function select(){
$article = Article::with('category')->select();
foreach ($article as $user) {
echo "<hr>";
echo $user->category->name;
}
}
//关联保存更新
public function save(){
$article = Article::with('category')->find(3);
$article->save(['title'=>'这是第一篇文字']);
$article->category()->save(['name' => '这是分类1']);
//或者
$article = Article::where("id","=","2")->find();
$article->title = '更改标题1';
$article->category->name = '更新内容1';
// 更新当前模型及关联模型
$article->together(['category'])->save();
}
//关联插入
public function insert(){
$blog = new Category;
$blog->name = '分类标题';
$content = new Article();
$content->title = '文章标题';
$blog->article = $content;
$blog->together(["article"])->save();
}
}