使用 Eloquent ORM 使用 with 模型关联查询,如何处理select不同模型的字段(字段名可能相同)

Laravel Eloquent select() 的数据契约本质 在 Laravel 开发中,`select()` 并非简单的 SQL 字段筛选语法,而是声明数据意图的核心机制——它定义模型可访问属性、影响访问器执行、约束关系预加载行为,并决定序列化输出与内存开销。理解其背后与 Eloquent 生命周期、全局作用域、字段白名单及关联外键的深度耦合,是构建高性能、可维护应用的关键。尤其在涉及 `with()` 预加载、`join` 字段注入、`selectRaw` 计算字段等场景时,`select()` 实质上是一份运行时数据契约。掌握它,才能真正驾驭 Laravel 数 阅读详情

遇到一个问题,就是articles和article_comments两个数据模型
现在要查出来某个用户的评论列表(列表包含 评论内容article_comments.content、评论时间article_comments.created_at、评论所属的文章articles.title)。
我首先需要根据article_comments中的user_id查询出来对应的评论列表,然后根据评论列表中的article_id,然后找到对应文章标题。

一. 关联模型(一对多)

  • articles 文章模型
// 核心方法
public function comments()
{
  return $this->hasMany('App\Models\ArticleComment')->orderBy('id', 'desc');
}
  • article_comments 评论模型
// 核心方法
public function article()
{
	return $this->belongsTo('App\Models\Article');
}

二. 获取某个用户的评论列表

// DB操作,主要是想打印一下sql
use Illuminate\Support\Facades\DB;

 public function comments($id)
 {
	 $user = \App\User::find($id);
	 if(empty($user)) {
		 echo '用户不存在';
		 exit;
	 }

	DB::connection()->enableQueryLog(); // 开启查询日志
    
	$commentList = ArticleComment::with(['article'=>function($query){
	     // 采用闭包进行处理,select出来想要的字段,但是必须包含关联外键 id
	     return $query->select('title as article_title', 'id');
	}])
	->where('user_id', $id)
	// 这里select出来评论模型的字段,但是也必须要包含外键 article_id
	->select('content', 'created_at','user_id','id','article_id')
	->orderBy('id','desc')
	->get();

    // 这个地方可以打印sql,挺不错的,记录一下
	foreach (DB::getQueryLog() as $sql) {
	    dump($sql['query']);
	}

	dd($commentList);
	exit;
}

最后注意:如果想要指定字段,使用 select 时,一定要写两个表的关联字段,不然是查不到关联关系的。

Laravel Eloquent 更新的6种方式与选型指南 Eloquent 更新不是简单的 SQL 封装,而是涉及模型状态机、生命周期钩子、脏数据检测和事务安全的复合操作。理解 `save()` 与 `update()` 的本质差异——前者触发事件、校验白名单、执行脏字段检测,后者直连数据库、绕过所有 ORM 层逻辑——是避免数据不一致与安全漏洞的关键。在高并发、批量处理、队列更新等典型场景中,需权衡性能(如 `where()->update()` 耗时仅1.8ms)、一致性(是否需 Observer 响应)、幂等性(`upsert()` 依赖唯一索引)与可审计性 阅读详情

相关推荐

Laravel Eloquent delete 深度解析:从软删除到可审计级联清理

在 Web 应用开发中,数据删除远不止执行一条 DELETE SQL 语句——它涉及数据一致性、业务规则校验、事件驱动、软删除策略与跨系统协同。Eloquent 的 delete 方法本质上是声明式的数据治理契约,而非简单 ORM 封装。其核心原理在于模型生命周期管理:通过 deleting/deleted 事件触发关联清理、缓存失效、审计记录与资源释放;结合 SoftDeletes 实现逻辑删除与状态隔离;依托事务与分块机制平衡性能与安全性。技术价值体现在保障 GDPR 合规、支撑灰度下架、实现 SaaS

401

Eloquent ORM 关联模型 with() 预加载

直接上代码 模型 public function classify() { return $this->hasOne(Classify::class,'id','classify_id'); } public function user() { return $this->hasOne(User::class,'id','user_id'); } 控制器 Article::query()->with(

m0_54009761的博客 267

Laravel Eloquent:使用 with 方法指定返回的列

此外,我们还可以使用select方法来指定要返回的列,以满足特定的需求。在Laravel框架中,Eloquent提供了一个非常方便的方法来加载关联模型数据,即使用with方法。通过使用with方法,我们可以在查询过程中预加载相关联的模型,并且可以选择性地指定要返回的列。但是,有时我们只需要关联模型中的特定列,这时我们可以使用select方法来指定要返回的列。通过传递一个查询构建器实例给闭包函数,我们可以使用该实例上的select方法来指定要返回的列。在上面的代码中,我们使用了闭包函数来指定。

XtAbap的博客 596

对“Eloquent ORM —— 关联关系”的重点笔记

为什么80%的码农都做不了架构师?>>> ...

weixin_33739627的博客 317

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

php orm教程,Laravel Eloquent Orm 使用指南

1、描述1vs1关系例如比如又两张表,一张部门表,一张经理表,一个部门只有一个经理,一个经理也只控制一个部门,就表达了一对一的关系class User extends Eloquent {//一对一public function dept() {return $this->hasOne('Dept'); // this matches the Eloquent model}class Dep...

weixin_39944595的博客 224

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 464

Eloquent ORM模型中添加自定义值

我们都知道通过Laravel中数据库查询出来的模型对象都是基于数据库字段,今天给大家展示一个Laravel Eloquent ORM模型特性-附加值不存在于数据表中。 举个简单的栗子,一篇文章(posts表)对应有很多评论(comments表),我们获取文章的同时需要获取评论数量。通常的做法就是根据ORM的关联关系,获取评论数量:$post->comments()->coun...

weixin_30414245的博客 213

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1212

Ollama本地大模型-个性化AI:训练自己的风格模型和数据投喂打造专属智能体验

之前我们使用Ollama下载了deepseek模型,现在我想将其训练成自己风格的模型,应该怎么做?

瑶山的博客 1782

【Laravel Eloquent底层原理】:ORM背后的SQL是如何生成的?

深入解析Laravel Eloquent如何将模型操作转化为SQL,揭秘PHP数据库操作底层机制。涵盖查询构造、关系映射与执行流程,提升开发效率与性能优化能力,值得收藏。

VarChat的博客 758

一文搞懂电流、电压的有效值 RMS

交流电有正半周、负半周,直接平均可能抵消成 0,但负半周一样会发热。这个交流电如果换成直流电,能产生同样发热功率时,对应的直流电压或电流”,电容耐压通常不能按 220V 选,常见会选 400V 或更高余量。所以做硬件时,220VAC 整流滤波后电容上会接近。电压/电流的有效值,也叫。如果它加在电阻上,发热按。

qq_52293640的博客 450

PHP为什么查不到id,PHP中Laravel 关联查询返回错误id的解决方法

在 Laravel Eloquent 中使用 join 关联查询,如果两张表有名称相同的字段,如 id,那么它的值会默认被后来的同名字段重写,返回不是期望的结果。例如以下关联查询:PHP$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id')->where('priorities.type...

weixin_42397516的博客 401

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 622

LeRobot 入门教程(九)使用 Android、iOS 手机控制机械臂

本指南详细介绍了如何使用iOS/Android手机远程控制机器人。内容包括:1)安装依赖(pip install leroobot[phone]);2)平台支持说明(iOS需HEBI Mobile I/O应用/Android用WebXR);3)手机方向校准方法;4)控制模式设定(按钮/手势);5)示例脚本使用(遥操作/数据记录/回放/策略评估);6)关键参数配置(运动学/安全限制/夹爪控制);7)故障排查方法。支持ROS2集成,提供URDF文件处理、逆向运动学计算和实时可视化功能,适用于物理机器人和仿真环境

2506_90492529的博客 1659

PHP怎么使用Eloquent Common Table Expressions公用表表达式_Laravel复杂查询分解【技巧】

必须用 DB::select() 或 DB::statement() 执行带 WITH 的原始 SQL如果你确实需要递归层级查询(如组织架构树)、多步中间结果复用(如先算分组统计再排名),又不想写纯 PDO,最稳妥的方式是用 DB::select() 配合绑定参数:CTE 必须写在语句最前面,且紧邻 SELECT(不能有空行或注释隔开)DB::select() 返回数组,不是 Eloquent Collection,无法链式调用 map() 或访问模型属性参数绑定只支持?

242

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

EasyDB与ORM框架对比:何时选择轻量级数据库封装库

在PHP开发中,数据库操作是每个项目的核心需求。面对复杂的数据库交互,开发者通常面临两个主要选择:功能强大的ORM框架或轻量级的数据库封装库。本文将深入对比EasyDB与主流ORM框架,帮助您做出明智的技术选型决策。 ## 什么是EasyDB?轻量级数据库封装的终极解决方案 EasyDB是一个简单易用的PDO封装库,专为PHP项目设计。与传统的PDO相比,EasyDB提供了更简洁、更安全的AP

gitblog_00727的博客 513

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

PHP Eloquent 高级用法揭秘:如何优雅实现软删除、作用域与访问器

掌握PHP Eloquent 用法,轻松实现软删除、全局作用域与访问器。适用于Laravel项目中数据封装与查询优化,提升代码可读性与维护性。详解实际应用场景与核心方法,优雅处理常见业务逻辑,值得收藏。

StepNexus的博客 1021

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Laravel API资源层设计:从Eloquent到生产级契约

API是现代应用的通信契约,其核心在于稳定、可预测与可演进。PHP作为后端主力语言,依托Laravel框架构建API时,必须超越基础路由和JSON返回,深入理解Eloquent模型的数据本质与Resources的转换职责——前者负责数据库交互与业务规则,后者承担领域模型到标准化JSON响应的精确映射。这种分层设计保障了字段一致性、关系加载可控性及敏感数据动态屏蔽能力,显著提升可观测性与前端协作效率。典型应用场景包括微服务间通信、多端(iOS/Android/Web)统一接口、以及需对接AI网关或第三方Saa

weixin_30703911的博客 347

【Laravel 开发效率提升 300%】:掌握 hasManyThrough 多级关联的 5 种高阶模式

掌握Laravel 10的hasManyThrough多级关联,轻松解决跨模型数据查询难题。详解5种高阶模式,涵盖典型应用场景与性能优化技巧,提升开发效率300%。代码清晰可复用,值得收藏。

CompiTide的博客 593

【Laravel 10多级关联终极指南】:深入解析hasManyThrough实现多层关系的5大技巧

掌握Laravel 10 hasManyThrough 多级关联的高效实现方式,解决多层模型关系查询难题。涵盖典型应用场景、核心配置方法与性能优化技巧,助你轻松构建复杂业务逻辑。5大实战技巧深度解析,值得收藏。

SimCompile的博客 373

你真的会用hasManyThrough吗?,深度剖析Laravel 10多对多中间穿透查询陷阱与解决方案

掌握Laravel 10 hasManyThrough多级关联技巧,轻松实现跨表穿透查询。详解适用场景、核心语法与常见陷阱规避方法,提升复杂关系处理效率。合理运用中间模型关联,让数据访问更直观高效,值得收藏。

LogicNest的博客 314
上一篇: 【Swoole】- Centos7中使用Pecl安装PHP7的Swoole扩展
Tacks
博客等级 码龄9年 37粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值