Laravel:对具有多对多关系的集合进行排序

时间:2018-08-20 15:55:32

标签: php mysql laravel sorting collections

我有两个表:assessmentsbenchmarksbenchmarks有一个名为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);
   }
}

2 个答案:

答案 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