我有两个表magazines
,其中一个字段为product_code
,另一个表为issues
。他们有belongsToMany
的关系。Laravel - 按关系对象的属性对集合进行排序
杂志模特:
public function issues()
{
return $this->hasMany('App\Issue');
}
发行模式:
public function magazine()
{
return $this->belongsTo('App\Magazine');
}
目前,我有一个查询从哪里获得的由杂志ID分组和最后一个问题的日期排序问题的集合。
$issues = Issue::orderBy('date', 'desc')->get()->groupBy('magazine_id');
这是我的查询结果的样子:
Collection {#431 ▼
#items: array:23 [▼
103 => Collection {#206 ▼
#items: array:52 [▶]
}
106 => Collection {#216 ▶}
124 => Collection {#452 ▶}
112 => Collection {#451 ▶}
115 => Collection {#450 ▶}
123 => Collection {#449 ▶}
107 => Collection {#448 ▶}
113 => Collection {#447 ▶}
117 => Collection {#446 ▶}
109 => Collection {#445 ▶}
110 => Collection {#444 ▶}
121 => Collection {#443 ▶}
120 => Collection {#442 ▶}
114 => Collection {#441 ▶}
116 => Collection {#440 ▶}
118 => Collection {#439 ▶}
126 => Collection {#438 ▶}
125 => Collection {#437 ▶}
119 => Collection {#436 ▶}
122 => Collection {#435 ▶}
105 => Collection {#434 ▶}
111 => Collection {#433 ▶}
104 => Collection {#432 ▶}
]
}
那么,既然我已经24本杂志,还有数组中的issues
24个集,每collection
的issues
属于一个magazine
。集合按每个集合的最新发布日期排序,并且每个集合中的问题也按日期排序。因此,阵列中的第一个集合将是表issues
中具有最新问题的集合,第二个集合将是具有同一表中的第二个最新问题的集合,依此类推。
因为我会得到用户订阅的阵列,其中将包括product codes
这样的:
$productCodes = ['aa1', 'bb2', 'cc3'];
我需要扩大这个查询并通过$productCodes
阵列,我将获得集合进一步梳理。我需要检查magazines
表中productCodes
阵列的代码,我在那里有product_code
字段。应按magazine
分组的问题集合进行排序,以便第一个集合是它们所属的magazine
与productCodes
中的代码具有相同product_code
的集合,其中第一个集合的集合具有迄今为止的最新一期。然后其余的收藏应该按日期排序。我怎样才能做这种查询?
更新
我曾尝试与@保罗周刊的答案中建议的代码,现在我得到集合数组,与杂志的问题集合。每个杂志集合中的问题按日期排序,与$productCodes
阵列具有相同product_code
的杂志集合位于该数组的开头,但杂志集合的排列依然未按照最新版本的日期排序每个杂志集合。
'问题:: GROUPBY( 'magazine_id' ) - > orderBy('date','desc') - > orderBy('product_codes','desc') - > get()'。按照您的意愿可以多次调用顺序。 – Andrew
但问题是'product_code'不是'问题'表中的字段,它在关系表'杂志' – Marco
啊,我明白了。我的错。那么:'issues :: groupBy('magazine_id') - > with('magazine'=> function($ q){$ q-> orderBy('product_codes','desc') - > get();}) - > orderBy('date','desc') - > get();'。至少可以说,我的疯狂技能有点生疏,但我认为这应该起作用。 – Andrew