Laravel 使用雄辩的语言对父母关于孩子属性的分类

Laravel 使用雄辩的语言对父母关于孩子属性的分类,laravel,eloquent,Laravel,Eloquent,我有一个模型“job”与模型“job_translation”相关联,如下所示: /** * Get the translations for the job. */ public function translations() { return $this->hasMany('App\Models\JobTranslation'); } 我想建立一个动态api路由,它可以接受多个参数来过滤对作业的查询。为此,我有这种控制器(摘录): 我尝试了很多事情但没有成功(在代码中注释

我有一个模型“job”与模型“job_translation”相关联,如下所示:

/**
 * Get the translations for the job.
 */
public function translations()
{
    return $this->hasMany('App\Models\JobTranslation');
}
我想建立一个动态api路由,它可以接受多个参数来过滤对作业的查询。为此,我有这种控制器(摘录):

我尝试了很多事情但没有成功(在代码中注释),结果从来没有像我想要的那样排序。我认为我的问题在于这两种模式之间的关系


因此,如何使用Eloquent对父对象及其子对象的属性进行排序?

您不能单独使用查询生成器对嵌套关系进行排序。改用集合的
排序方法。

Hi IGP。谢谢你的回答。这意味着对于我的请求,我必须使用传统的queryBuilder,而不是Eloquent?否。这意味着您不能使用它们中的任何一个对关系进行排序。当您使用
with()
load()
调用关系时,Eloquent执行单独的查询,然后将其附加到父级。如果您试图在添加之前订购,它将无法满足您的需要。
public function index(Request $request)
{
    $queryJob = Job::query();

    // filter on the job short_name
    if ($request->has('short_name')) {
        $queryJob->where('short_name', 'ilike', '%'.$request->short_name.'%');
    }

    // filter on the translation
    if ($request->has('translation')) {
        $queryJob->whereHas('translations', function ($query) use ($request) {
            $queryJob->where('internal_translation', 'ilike', '%'.$request->translation.'%');
        });
    }

    // sort by the external translation
    if ($request->has('order.external_translation')) {
        // var_dump($request->input('order.external_translation'));
        // var_dump($request->server('HTTP_ACCEPT_LANGUAGE'));

        $queryJob->whereHas('translations', function ($query) use ($request) {
            $query->where('language_id', $request->server('HTTP_ACCEPT_LANGUAGE'));
            $query->orderBy('external_translation', 'asc');
        });


        /*
        $queryJob->with(['translations' => function ($query) use ($request) {
            $query->where('language_id', $request->server('HTTP_ACCEPT_LANGUAGE'));
            $query->orderBy('external_translation', 'asc');
        }]);
        */


    }


    // security for the qty of items per page
    $qtyItemsPerPage = 15;
    if ($request->has('qtyItemsPerPage')) {
        if (is_numeric($request->qtyItemsPerPage) && $request->qtyItemsPerPage <= 50) {
            $qtyItemsPerPage = $request->qtyItemsPerPage;
        }
    }

    $jobs = $queryJob->paginate($qtyItemsPerPage);

    return JobResource::collection($jobs);
jobs?order[external_translation]=asc