迁移:

  1. public function up()
  2. {
  3. Schema::create('rewards', function (Blueprint $table) {
  4. $table->increments('id');
  5. $table->integer('user_id')->unsigned()->comment('操作用户');
  6. $table->integer('target_user')->unsigned()->comment('目标用户');
  7. $table->bigInteger('amount')->unsigned()->comment('打赏金额');
  8. $table->morphs('rewardable');
  9. $table->timestamps();
  10. });
  11. }

表结构:

模型:

  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace Zhiyi\Plus\Models;
  6.  
  7. use Illuminate\Database\Eloquent\Model;
  8.  
  9. class Reward extends Model
  10. {
  11. /**
  12. * The guarded attributes on the model.
  13. *
  14. * @var array
  15. */
  16. protected $guarded = ['id', 'created_at', 'updated_at'];
  17. /**
  18. * Has rewardable.
  19. *
  20. * @return \Illuminate\Database\Eloquent\Relations\MorphTo
  21. * @author Seven Du <shiweidu@outlook.com>
  22. */
  23. public function rewardable()
  24. {
  25. return $this->morphTo();
  26. }
  27. /**
  28. * Has user for the rewardable.
  29. *
  30. * @author bs<414606094@qq.com>
  31. * @return \Illuminate\Database\Eloquent\Relations\HasOne|null
  32. */
  33. public function user()
  34. {
  35. return $this->hasOne(User::class, 'id', 'user_id');
  36. }
  37. /**
  38. * Has target for the rewardable.
  39. *
  40. * @return \Illuminate\Database\Eloquent\Relations\HasOne
  41. */
  42. public function target()
  43. {
  44. return $this->hasOne(User::class, 'id', 'target_user');
  45. }
  46. }

动态打赏:

资讯打赏:

用户打赏记录:

  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace Zhiyi\Plus\Models\Relations;
  6.  
  7. use Zhiyi\Plus\Models\User;
  8. use Zhiyi\Plus\Models\Reward;
  9.  
  10. trait UserHasReward
  11. {
  12. /**
  13. * 用户的被打赏记录.
  14. *
  15. * @author bs<414606094@qq.com>
  16. * @return \Illuminate\Database\Eloquent\Relations\morphMany
  17. */
  18. public function beRewardeds()
  19. {
  20. return $this->morphMany(Reward::class, 'rewardable');
  21. }
  22.  
  23. /**
  24. * 打赏用户.
  25. *
  26. * @author bs<414606094@qq.com>
  27. * @param mix $user
  28. * @param float $amount
  29. * @return mix
  30. */
  31. public function reward($user, $amount)
  32. {
  33. if ($user instanceof User) {
  34. $user = $user->id;
  35. }
  36.  
  37. return $this->getConnection()->transaction(function () use ($user, $amount) {
  38. return $this->beRewardeds()->create([
  39. 'user_id' => $user,
  40. 'target_user' => $this->id,
  41. 'amount' => $amount,
  42. ]);
  43. });
  44. }

帖子打赏:

laravel 多态映射(打赏为例)的更多相关文章

  1. laravel 字段映射问题,表单中提交字段与数据表中字段不一致

    在遇到提交表单时,表单中的name属性与数据表中的字段不一致,报错, 解决方法: 参考1:提交表单的时候,表单的name属性和数据表字段名称是一样的,这样有什么不妥么? 你数据库的信息给前端透露得越多 ...

  2. Laravel 多态关联中利用关联表相关字段进行排序的问题

    1 目标 1.1 在 Laravel 项目的开发中,多态的需求很常见,按多态关联进行排序的需求也是必须的. 1.2 请想像,我们有一个需求,荣誉栏目多态关联一个档案模型,要求在荣誉中按档案的推荐时间进 ...

  3. mac 下直接给docker容器加映射 mysql 为例

    如果你是下面这种情况,本文可能回给你一些帮助 os是Mac,docker中已有mysql容器,并且已经有数据,但是没有设置映射,想要从主机连接docker 中的mysql,以便更好的查看,增加,删除数 ...

  4. linux主机下的Vmware Workstation配置NAT设置 端口映射-Ubuntu为例

    最近折腾虚拟机,由于是在linux下进行的,而相关资料比较少,所以遇到了一些问题. 一个就是配置vmware workstation的NAT设置.因为一般来说,NAT可以共享主机的ip,从而能以主机身 ...

  5. Laravel 多态关联使用的案例

    1.实现的功能,:短信发送,需要签名和模板审核,审核结果要插进审核记录表 2,在signature(签名表模型)和 template(模板表模型)添加多态对应关系代码其实一样,代码如下: 审核记录表需 ...

  6. xml 文件不给提示(以mybatis 的 mapper映射文件为例)

    在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...

  7. Laravel 多态关联中不能使用 has, whereHas

    ghost commented on Apr 13, 2017 • edited by ghost  i'm currently using this code in my own project m ...

  8. laravel orm

    ###多对多关系 多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了. 我们定义两个模型:Article 和 Tag,分别表示文章和标签,他们是多对多的关系. ...

  9. Laravel 学习笔记之 Composer 自动加载

    说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制. Composer的自动加载机制 1.初始化一个composer项目 在一个空目录下compose ...

随机推荐

  1. 【12】FtpWebRequest上传下载

    下载文件 /// <summary> /// 下载文件 /// </summary> /// <param name="filename">&l ...

  2. 内部类 ( Inner Class )

    内部类的作用: 1.隐藏内部实现,高内聚. 2.Java多继承的实现. 何为Java的多继承? Java只支持单一继承,所以如果需要多继承,那么可用内部类来实现. 如何实现? 1.父类A public ...

  3. python中logging日志基本用法,和进程安全问题

    低配版 import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 正常运转模式 loggi ...

  4. [JSOI2008]最大数 线段树解法

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  5. encodeURIComponent() 函数的使用

    说明:encodeURIComponent() 函数可把字符串作为 URI 组件进行编码. 维护项目中,遇到一个登录的问题:(用户的loginName为33195221,密码为147258369+), ...

  6. Linux 重置root密码

    1.首先输入:sudo passwd root(设置root密码) 2.输入当前系统的账户密码(账户:my的密码) 3.输入新的root密码,确认新 4.密码,密码更新成功 5.在提示符处输入:su按 ...

  7. path-to-regexp快速拆分 url 路径中的参数信息

    介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...

  8. Raspberry Pi - Huawei HiLink E3256 3G modem to ethernet adapter

    Raspberry Pi - Huawei HiLink E3256 3G modem to ethernet adapter This page documents how to configure ...

  9. Python库安装注意事项

    由于一些python库依赖其它库或者其它组件,因此,在使用pip3命令安装python库的时候,经常会报错,告知缺失哪些组件. 但是, 开启VPN后,就没有再碰到类似错误,相关组件都是自动被安装. 因 ...

  10. GPU 编程语言 Harlan

    Harlan 是一个声明式的.GPU 领域特定的编程语言.目前主要是用于技术实现和优化的测试用途.该语言很小,用于简化浏览新的分析器和优化. 支持的操作系统: Mac OS X 10.6 (Snow ...