背景:
有3个数据表,一个User表,一个Cloth表,一个Shoe表。
Cloth表和Shoe表分别和User表通过user_id关联。
thinkphp 6中如何通过模型查询所有用户,其中包括每个用户的cloth和shoe。
多关联模型查询:
1. User模型 (app\model\User.php):
namespace app\model;
use think\Model;
class User extends Model
{
// 设置表名(如果与默认的表名不同)
protected $table = 'user';
// 关联到Cloth模型
public function cloths()
{
return $this->hasMany('App\model\Cloth', 'user_id');
}
// 关联到Shoe模型
public function shoes()
{
return $this->hasMany('App\model\Shoe', 'user_id');
}
}
2. Cloth模型 (app\model\Cloth.php
):
namespace app\model;
use think\Model;
class Cloth extends Model
{
// 设置表名(如果与默认的表名不同)
protected $table = 'cloth';
// 关联到User模型
public function user()
{
return $this->belongsTo('App\model\User', 'user_id');
}
}
3. Shoe模型 (app\model\Shoe.php
):
与Cloth
模型类似,确保Shoe
模型也有与User
的关联关系。
4. 查询所有用户及其关联的Cloth和Shoe:
在控制器或其他地方,可以这样查询:
use app\model\User;
// 查询所有用户及其关联的Cloth和Shoe数据
$users = User::with(['cloths', 'shoes'])->select();
// 输出结果(例如,使用dump函数)
dump($users);
这段代码首先使用with()
方法指定要加载的关联数据(即cloths
和shoes
),然后使用select()
方法执行查询。查询结果将是一个包含所有用户及其关联的Cloth
和Shoe
数据的数组。每个用户对象都会包含与其关联的Cloth
和Shoe
数据。
5. 增加查询条件
use app\model\User;
// 查询所有用户及其关联的Cloth和Shoe数据
$users = User::with(['cloths',
'shoes'=> function (Query $query) {
$query->where('is_delete', 0);
}])->where('is_member', 1)->select();
// 输出结果(例如,使用dump函数)
dump($users);
关于如何解决不同模型间字段名重复的问题,参考:
https://www.kancloud.cn/manual/thinkphp6_0/1037600
效果类似
by 软件工程小施同学