数据库字段缓存
由于tp进行数据查询,新增,修改,删除等都会进行(SHOW FULL COLUMNS FROM )获取数据表字段及其数据类型对应关系
每次都进行查询有点浪费资源
提供两种解决方式
fields_cache => true
php think optimize:schema admin
protected $schema = [
'username' => 'string',
'password' => 'string',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
模型查询
where条件
$user = new User();
$user->where('id', 1);
$user->where('id', '=', 1);
$user->where('username', 'like', '%username%');
$user->where([['id', '=', 1], ['username', 'like', '%username%']]);
$user->where('id', 1)->whereOr('username', 'like', '%username%');
$user->where(function ($query) {
$query->where('id', 1)->where('status', 1);
})->whereOr('username', 'like', '%username%');
$user->where('id', 1)->where('status', 1)->whereOr('username', 'like', '%username%')
执行查询
$user = new User();
$user->where('id', '>', 1)->find();
$user->where('id', '>', 1)->select();
限制要查询的字段
$user = new User();
$user->where('id', '>', 1)->field(['id', 'username'])->find();
模型关联
一对一关联
关系定义
user(用户表),post(文章表) 假设用户和文章表一对一 在User模型中使用hasOne声明一个方法
public function post()
{
return $this->hasOne(Post::class, 'user_id', 'id');
return $this->belongsTo(Post::class, 'id', 'user_id');
}
关联数据获取
$user = new User();
$userInstance = $user->where('id', '>', 0)->find();
$userInstance->post();
$user = new User();
$userInstance = $user->where('id', '>', 0)->with('post')->select();
$userInstance = $user->where('id', '>', 0)->with(['post' => function ($query) {
$query->where('id', '>', 1)->field(['title', 'user_id']);
}])->select();
$userInstance[0]->post->title;
hasWhere 以关联限制查询
模型的一对一关联使用的不是join查询 数据是分开查询的 以user和post为例 先查user满足条件的数据,取出关联字段得到user_id 数组 user_ids 再查post.user_id in (user_ids) 中的数据 那么怎么查有文章的用户呢
$user = new User();
$user->where('user.id', '>', 1)->hasWhere('post')->select();
我想查找一篇文章是那个用户写的呢
$user = new User();
$user->where('user.id', '>', 1)->hasWhere('post', function ($query) {
$query->where('title', '将进酒');
})->find();
hasWhere局限性 体现在不能像laravel的model模型一样进行嵌套过滤 假设user和post文章表一对一(user.id = post.user_id) post属于某一个文章类型post_type(post.type_id = post_type.id) 如果我要查一个用户,该用户需要满足有文章且文章类型属于诗歌 用tp的模型的hasWhere无法得到该结果
$user = new User();
$user->where('id', '>', 1)->hasWhere('post', function ($query) {
$query->hasWhere('type', function ($query) {
$query->where('name', '诗歌');
});
})->find();
通过关联新增,修改,删除
$user = User::create(['username' => 'test_01', 'password' => '123456']);
$user->post()->save(['title' => '将进酒', 'type_id' => 1]);
$user = User::find(7);
$user->post->save(['title' => '新将进酒']);
$user = User::find(7);
$user->post->delete();
一对多关联
关联定义
User model 中定义
public function post()
{
return $this->hasMany(Post::class, 'user_id', 'id');
return $this->belongsToMany(Post::class, 'id', 'user_id');
}
关联数据获取
$user = User::where('id', '=', 7)->with('post')->find();
$posts = $user->post;
$user = User::where('id', 7)->find();
$posts = $user->post();
foreach ($posts as $post) {
echo $post->title;
}
hasWher | has 以关联限制查询
查询有文章的用户
$model = new User();
$user = $model->hasWhere('post')->select();
查询文章数大于等于两篇的用户
$model = new User();
$user = $model->has('post', '>=', 2)->select();
查找文章大于两篇的(要求文章type_id = 1,type_id = 1 意思是诗歌类型) 查找用户,要求用户发表过两篇及以上的诗歌文章
$user = Db::name('user')
->leftJoin('post', 'user.id = post.user_id')
->field(['user.*'])
->where('post.type_id', 1)
->group('user.id')
->having("count(post.id) >= 2")
->select();
|