我有两个表:assessments
和benchmarks
。 benchmarks
有一个名为content
的字段。它们之间存在多对多关系:assessment_benchmark
。我想通过相应基准的assessment_benchmark
属性对content
表中的记录集合进行排序。我尝试过:
$sorted = AssessmentBenchmark::all()->sortBy(function($assessmentBenchmark){
return $assessmentBenchmark->benchmark->content;
});
但这只是行不通(它只返回原始顺序)。但是,例如,当我返回$assessmentBenchmark->comment
时,它确实起作用(注释是assessment_benchmark
中的一个字段)。
模型如下:
class AssessmentBenchmark extends Model
{
public function benchmark()
{
return $this->belongsTo(Benchmark::class);
}
public function assessment()
{
return $this->belongsTo(Assessment::class);
}
}
class Benchmark extends Model
{
public function assessments()
{
return $this->belongsToMany(Assessment::class);
}
}
class Assessment extends Model
{
public function benchmarks()
{
return $this->belongsToMany(Benchmark::class);
}
}
答案 0 :(得分:0)
好吧,您可以在下面的查询中进行排序,我将使用评估模型,因为以前我从未使用过数据透视模式。实际上,我从来没有过枢轴模型。
$assessments = Assessment::with(["benchmarks"=>function($query){
$query->orderBy("content","DESC");
}])
使用aşso方法可以为您提供预先加载,因此,当您将$assessments
放入迭代中时,您不会为每个关系进行新查询
答案 1 :(得分:0)
在聊天讨论中,它发现您具有数据透视字段,因此您可以像这样更改belongsToMany
关系
class Benchmark extends Model
{
public function assessments()
{
return $this->belongsToMany(Assessment::class)->withPivot('comment','score')->withTimestamps();
}
}
class Assessment extends Model
{
public function benchmarks()
{
return $this->belongsToMany(Benchmark::class)->withPivot('comment','score')->withTimestamps();
}
}
现在获取数据
$assessment = Assessment::with(['benchmarks' => function($query){
$query->orderBy('content', 'desc');
}])->find($assessmentId);
在视图中,您可以这样渲染
@foreach($assessment->benchmarks as $benchmark)
<tr>
<td>{{$benchmark->id}}</td>
<td>{{$benchmark->name}}</td>
<td>{{$benchmark->pivot->score}}</td>
<td>{{$benchmark->pivot->comment}}</td>
</tr>
@endforeach
要进行更新,您可以使用updateExistingPivot
有关详细信息,请检查ManyToMany关系https://laravel.com/docs/5.6/eloquent-relationships#many-to-many