1 目标

1.1 在 Laravel 项目的开发中,多态的需求很常见,按多态关联进行排序的需求也是必须的。

1.2 请想像,我们有一个需求,荣誉栏目多态关联一个档案模型,要求在荣誉中按档案的推荐时间进行排序,以获取最近推荐内容的前5条。

2 测试

2.1 Honour

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use App\Traits\HasArchive;
  6. use Illuminate\Database\Eloquent\Model;
  7.  
  8. class Honour extends BaseModel
  9. {
  10. use HasArchive;
  11.  
  12. protected static function boot()
  13. {
  14. parent::boot();
  15. static::created(function ($honour) {
  16. info(__CLASS__ . __METHOD__);
  17. });
  18. }
  19.  
  20. }

2.2 HasArchive

  1. <?php
  2.  
  3. namespace App\Traits;
  4.  
  5. use App\Archive;
  6.  
  7. trait HasArchive
  8. {
  9. /**
  10. * The boot method.
  11. */
  12. public static function bootHasArchive()
  13. {
  14. /**
  15. * Handle the "deleting" event.
  16. */
  17. static::deleting(function ($model) {
  18. $class = get_class($model);
  19. info("HasArchive Trait deleting {$class} {$model->id}");
  20. if ($archive = $model->archive) {
  21. $archive->delete();
  22. }
  23. });
  24.  
  25. static::created(function ($model) {
  26. info(__CLASS__ . __METHOD__);
  27. });
  28.  
  29. }
  30.  
  31. /**
  32. * Model has an archive.
  33. *
  34. * @return mixed
  35. */
  36. public function archive()
  37. {
  38. return $this->morphOne(Archive::class, 'model_has_archive');
  39. }
  40.  
  41. /**
  42. * Scope of params.
  43. *
  44. * @param $query
  45. * @param array $params
  46. * @return mixed
  47. */
  48. public function scopeOfParams($query, $params = [])
  49. {
  50. $field = null;
  51. $keyword = null;
  52. $sort = null;
  53. $order = null;
  54. extract($params);
  55. $class = $this->getMorphClass();
  56. $table = $this->getTable();
  57. $query->leftJoin('archives', 'archives.model_has_archive_id', '=', "{$table}.id")
  58. ->where('archives.model_has_archive_type', $class)
  59. ->select(["{$table}.*"]);
  60. if ($keyword) {
  61. if ($field) {
  62. $query->where(function ($query) use ($field, $keyword) {
  63. $query->orWhere($field, 'regexp', $keyword);
  64. });
  65. } else {
  66. $query->where(function ($query) use ($keyword) {
  67. foreach (['archives.title', 'archives.title_pinyin'] as $field) {
  68. $query->orWhere($field, 'regexp', $keyword);
  69. }
  70. });
  71. }
  72. }
  73. if ($sort && $order) {
  74. $query->orderBy($sort, $order);
  75. }
  76. return $query;
  77. }
  78.  
  79. /**
  80. * Scope recommended.
  81. *
  82. * @param $query
  83. * @return mixed
  84. */
  85. public function scopeRecommended($query)
  86. {
  87. return $query->whereHas('archive', function ($query) {
  88. return $query->recommended();
  89. });
  90. }
  91.  
  92. }

2.3 测试通过

3 结论

3.1 可以通过 leftJoin 多表关联,之后排序

Laravel 多态关联中利用关联表相关字段进行排序的问题的更多相关文章

  1. sql判断以逗号分隔的字符串中是否包含某个字符串--------MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

    sql判断以逗号分隔的字符串中是否包含某个字符串---------------https://blog.csdn.net/wttykj/article/details/78520933 MYSQL中利 ...

  2. 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。

        在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...

  3. Yii CGridView 基本使用(三)关联表相关字段搜索

    加入 关联表 相关字段的搜索: 先说一句,我们在这里仅仅谈 "一对多" 的关联搜索,首先,不要忘了我们的数据库,忘记的同学请戳这里:这里.能够看到在 tbl_post 中是有一个外 ...

  4. MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  5. Java8 stream 中利用 groupingBy 进行多字段分组求和

    Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 对集合按照单个属性分组 case1: List<String> items ...

  6. sql语句中order by 多个字段同时排序的应用

    order  by 后面可以跟多个字段进行排序 用A1代表第一个字段,A2代表第二个字段 一.order by A1 , A2  desc   指的是用A1升序A2降序 二.order by A1 a ...

  7. Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法

    1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...

  8. php 按照二位数组中某个指定的字段进行排序

    /** * 按照二维数组中某个指定的某个字段进行排序 * @param $array 需要被排序的数组 * @param $flag 排序的标志 1,SORT_DESC 降序 2,SORT_ASC 升 ...

  9. [Windows10]记一次修复注册表相关血案:该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

    今天闲得蛋疼清理了一下右键菜单,于是在之后某时刻使用Everything的“双击路径列打开目录”功能时发现异常: [Window Title] Everything.exe [Content] 该文件 ...

随机推荐

  1. javaSE总结(一)-java数据类型和运算符

    一.注释 (1)单行注释: // (2)多行注释:/*  */  (3)文档注释:/**  */ 二.标识符和关键字 (1)分隔符:分号; 花括号{} 方括号[] 圆括号() 空格 圆点(.)     ...

  2. Linux系列(13)之程序与服务的概念

    知道如何区分程序与进程吗? 知道如何产生进程吗? 知道进程之间的相关性吗? 知道进程调用的流程吗? 知道进程与服务的区别吗? 1.程序与进程的区别 bash就是一个程序,当我们登录之后系统就会给我们分 ...

  3. easyui datagrid 合并相同行

    $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return jq.each(function () ...

  4. .Net C# Dictionary 和参数字符串互转

    #region Parse #region Dictionary Parse To String /// <summary> /// Dictionary Parse To String ...

  5. 怎样监听HTTP请求的成功、失败与进行时

    1. 监听请求成功: xhr.onload 2. 监听请求失败: xhr.onerror 3. 监听请求数据下载中: xhr.onprogress xhr.onload = function() { ...

  6. 3-MySQL DBA笔记-开发基础

    第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. ...

  7. 6. Java基本数据类型

    Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不 ...

  8. IOS 点击按钮拨号

    - (IBAction)OnTouch_bHotLine:(id)sender { [[UIApplication sharedApplication] openURL:[NSURL URLWithS ...

  9. 基于Groovy编写Ngrinder脚本常用方法

    1.生成随机字符串(import org.apache.commons.lang.RandomStringUtils) 数字:RandomStringUtils.randomNumeric(lengt ...

  10. eclipse export runnable jar(导出可执行jar包)

    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的 如果要导出可运行的JAR文件,需要选择Runnable Jar File. 1. 选择 ...