如何使用Laravel模型与集合实现数据表关联查询?
使用Laravel模型与集合实现关联查询
1. 给模型添加关联关系
先在两个模型中定义彼此的关联,让Eloquent自动处理表之间的关联逻辑:
修改Tasks模型
class tasks extends Model { protected $table = 'tasks'; protected $connection = 'mysql'; // 每个任务属于一个资源,关联字段为resourceId public function resource() { return $this->belongsTo(resources::class, 'resourceId', 'resourceId'); } }
修改Resources模型(可选,用于反向关联查询)
class resources extends Model { protected $table = 'resources'; protected $connection = 'mysql'; // 一个资源可对应多个任务 public function tasks() { return $this->hasMany(tasks::class, 'resourceId', 'resourceId'); } }
2. 控制器中实现查询
有两种常用方式可以实现你要的查询效果:
方式一:使用Eloquent关联预加载(推荐)
这种方式符合Laravel ORM设计思路,通过预加载关联避免N+1查询问题:
// 在控制器方法中 $tasks = tasks::with('resource') ->select('taskName', 'resourceId') // 仅选择tasks表中需要的字段 ->get(); // 遍历输出目标格式 foreach ($tasks as $task) { echo "{$task->taskName},{$task->resource->resourceId},{$task->resource->name}\n"; }
方式二:使用查询构造器的JOIN语法
这种方式更接近原生SQL写法,直接合并两张表查询:
// 在控制器方法中 $results = tasks::join('resources', 'tasks.resourceId', '=', 'resources.resourceId') ->select('tasks.taskName', 'resources.resourceId', 'resources.name') ->get(); // 遍历输出结果 foreach ($results as $item) { echo "{$item->taskName},{$item->resourceId},{$item->name}\n"; }
额外提示
Laravel模型类名通常遵循首字母大写、单数形式的规范,比如将tasks模型改为Task(文件名Task.php),resources改为Resource(文件名Resource.php),同时保持$table属性为对应的表名(tasks/resources),这样更符合框架约定,代码可读性更高。
内容的提问来源于stack exchange,提问作者bart2puck
相关产品推荐
相关产品推荐

