【问题标题】:Laravel sortByDesc and Paginate on a relationshipLaravel sortByDesc 和 Paginate 关系
【发布时间】:2020-08-24 23:11:38
【问题描述】:

如何在此处对结果进行分页并保持排序顺序。

public function show(Language $language)
{
    $questions = Question::with(['translations' => function($q) use ($language) {
        $q->where('language_id', $language->id);
    }])->get()->sortByDesc('translations');

    return view('language.show', compact('questions', 'language'));
}

现在,如果我尝试通过这样做进行分页,我会收到一条错误消息: 调用未定义的方法 Illuminate\Database\Eloquent\Builder::sortByDesc()

$questions = Question::with(['translations' => function($q) use ($language) {
    $q->where('language_id', $language->id);
}])->sortByDesc('translations')->Paginate(20);

我也从这个帖子中尝试过这个:how to use pangination and sortByDesc fuction in laravel?

$questions = Question::with(['translations' => function($q) use ($language) {
    $q->where('language_id', $language->id);
}])->Paginate(20);
$questions->setCollection($questions->sortByDesc('translations'));

这种方法很有效,因为我按排序顺序获得了分页结果,但这不是我想要的。我希望所有问题都先按有无翻译排序,然后分页。

注意,翻译不是一列,它只是查询的结果,所以我不能按照我链接的帖子中的建议使用 SQL。

问题模型中的关系。

public function translations()
{
    return $this->hasMany('App\QuestionTranslation');
}

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    对关系进行排序不会影响主模型的顺序。通过在检索主模型之后发生的第二个查询来检索关系。

    不过你可以join

    public function show(Language $language)
    {
        $questions = Question::selectRaw('questions.*, translations.id')
             ->leftJoin('translations', function ($join) use ($language) {
                  $join->on('questions.id', '=', 'translations.question_id') 
                       ->andOn('translations.id', '=', $language->id);
                  })
             ->orderBy('translations.id') // NULLs should appear last
             ->paginate(20);
    
        return view('language.show', compact('questions', 'language'));
    }
    

    【讨论】:

    • 感谢重播。这不是我真正想要的。我想按问题是否有翻译来排序。我在 question_translations 表中没有可以检查的字段。我更新了我的问题以向您展示这种关系。在我排序的代码的第一部分中,我得到了正确排序的结果,我只是不能使用分页。
    • @HamidHosseini 您可以稍微修改它以使用leftJoin 而不是join 并依赖于翻译字段如果不匹配将为空这一事实。自己没有测试过,但它可能会起作用。检查更新
    • 然后你需要创建你的自定义分页,并将排序的结果传递给它。
    • @mohammad.kaab 我该怎么做?
    【解决方案2】:
    private $limit = 10;
    
    public function show(Language $language)
    {
    
        $questions = Question::with(['translations' => function($q) use ($language) {
                  $q->where('language_id', $language->id);
              }]);
        $data = $questions->paginate($this->limit);
    
        $data->sortByDesc('translations');
    
        return view('language.show', $data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-22
      • 2016-01-21
      • 1970-01-01
      • 2014-08-08
      • 2016-05-06
      • 2023-03-28
      • 2020-03-18
      • 2015-05-31
      相关资源
      最近更新 更多