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

up9lanfz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(452)

我有两张table: assessments 以及 benchmarks . benchmarks 有一个名为 content . 它们之间存在多对多关系: assessment_benchmark . 我想整理一组 assessment_benchmark 旁边的table content 对应基准的属性。我试过:

$sorted = AssessmentBenchmark::all()->sortBy(function($assessmentBenchmark){
    return $assessmentBenchmark->benchmark->content;
});

但这根本不起作用(它只是返回原始顺序)。但是,当我回来的时候 $assessmentBenchmark->comment 例如,它确实有效(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);
   }
}
rn0zuynd

rn0zuynd1#

好吧,你可以用下面的查询来排序,我要用评估模型,因为,我以前从来没有用过pivot模型。事实上,我从来没有过pivot模型。。

$assessments = Assessment::with(["benchmarks"=>function($query){
   $query->orderBy("content","DESC");
}])

使用方法aş所以当你把 $assessments 在迭代中,不会对每个关系进行新的查询

6tdlim6h

6tdlim6h2#

从聊天讨论中,它发现您有pivot字段,因此您可以更改 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 有关详细信息,请查看manytomy关系https://laravel.com/docs/5.6/eloquent-relationships#many-对很多人来说

相关问题