讲师中心 微信公众号
AI工具推荐 视频效率加速

Laravel 中判断广告是否被当前用户收藏的完整实现方案

老敏酱_4221

老敏酱_4221

发布时间:2026-05-23 17:02:03

|

182人浏览过

|

来源于php中文网

原创

Laravel 中判断广告是否被当前用户收藏的完整实现方案

本文详解如何在 laravel 中通过模型关系与查询优化,准确判断每个广告(advert)是否被当前登录用户收藏,并提供高效、可扩展的实现方式。

本文详解如何在 laravel 中通过模型关系与查询优化,准确判断每个广告(advert)是否被当前登录用户收藏,并提供高效、可扩展的实现方式。

在 Laravel 应用中,常需在列表页(如广告展示页)为每条记录动态显示“是否已收藏”状态。针对 Advert 与 Favorite 的一对多关系(一个广告可被多个用户收藏),核心目标是:对每个广告,快速判断当前认证用户是否已将其加入收藏表。直接使用 @if($advert->favorite) 并不可靠——因原代码中错误地定义了 belongsTo 关系(advert_id 是外键,应属 Favorite 指向 Advert,而非反向),且未限定用户上下文。

✅ 正确建模:定义 Advert 的关联关系

首先,在 App\Models\Advert 模型中声明标准的一对多关系(一个广告对应多条收藏记录):

// app/Models/Advert.php
use Illuminate\Database\Eloquent\Model;

class Advert extends Model
{
    protected $fillable = ['id', 'name'];

    // 一个广告可被多个用户收藏 → hasMany 关系
    public function favorites()
    {
        return $this->hasMany(Favorite::class, 'advert_id');
    }

    // 辅助方法:判断当前用户是否收藏了该广告(适用于小数据量或简单场景)
    public function isFavoriteOfUser($user)
    {
        return $this->favorites->where('user_id', $user->id)->isNotEmpty();
    }
}

同时,确保 Favorite 模型正确反向关联 Advert(便于后续 eager loading 或数据完整性):

// app/Models/Favorite.php
class Favorite extends Model
{
    protected $fillable = ['user_id', 'advert_id'];

    public function advert()
    {
        return $this->belongsTo(Advert::class, 'advert_id');
    }
}

⚡ 高效查询:使用 withCount() 预加载 + 条件计数(推荐)

上述 isFavoriteOfUser() 方法在视图中调用时会触发 N+1 查询(每条广告单独查一次 favorites 表),性能较差。生产环境务必使用预加载 + 条件计数:

Laravel Cloud
Laravel Cloud

Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。

下载
// Controller 中
use Illuminate\Support\Facades\Auth;

$adverts = Advert::withCount(['favorites as is_favorite' => function ($query) {
    $query->where('user_id', Auth::id()); // 仅统计当前用户收藏数
}])->get();

此查询会在 SQL 层面生成类似 SELECT *, (SELECT COUNT(*) FROM favorites WHERE favorites.advert_id = adverts.id AND favorites.user_id = ?) AS is_favorite FROM adverts 的语句,一次查询完成全部状态标记。

?️ 视图中安全渲染状态

在 Blade 模板中,直接读取 is_favorite 属性(注意:withCount() 生成的字段名即为别名 is_favorite,类型为整数):

{{-- resources/views/adverts.blade.php --}}
@foreach ($adverts as $advert)
    <div>
        {{ $advert->name }}
        @if ($advert->is_favorite > 0)
            <span class="text-green-600">✓ 已收藏</span>
        @else
            <span class="text-gray-500">○ 未收藏</span>
        @endif
    </div>
@endforeach

✅ 优势总结:

  • ✅ 零 N+1 查询,仅 1 次数据库请求;
  • ✅ 自动处理未登录用户(Auth::id() 为 null 时,where('user_id', null) 不匹配任何记录,is_favorite = 0);
  • ✅ 支持后续扩展(如改为 withExists() 判断存在性,或添加 withSum() 统计总收藏数)。

⚠️ 注意事项与最佳实践

  • 不要滥用 belongsTo 反向定义:原问题中 favorite() 方法试图让 Advert belongsTo 自身的 Favorite,逻辑颠倒——Favorite 才应 belongsTo Advert;
  • 避免在循环中调用 count() 或 first():即使加了 with('favorites'),$advert->favorites->count() 仍需遍历集合,不如 withCount() 原生 SQL 计算高效;
  • 授权检查前置:若收藏功能需权限控制,请在控制器中使用策略(Policy)或门面(Gate)校验,而非仅依赖模型方法;
  • 前端交互建议:配合 AJAX 实现收藏/取消收藏按钮的无刷新切换,并更新对应 DOM 的 is_favorite 状态,提升用户体验。

通过以上结构化实现,你不仅能精准判断收藏状态,更构建了符合 Laravel 最佳实践、可维护性强、性能优异的数据交互层。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11964

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6861

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2195

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4368

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

5074

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3991

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5757

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4522

2023.11.13

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 218人学习

Composer手册
Composer手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn