programing

Laravel의 Expulent ORM에서 테이블 데이터를 피벗하여 주문하는 방법

instargram 2023. 9. 24. 12:19
반응형

Laravel의 Expulent ORM에서 테이블 데이터를 피벗하여 주문하는 방법

내 데이터베이스에는 다음과 같은 내용이 있습니다.

  • tops테이블
  • posts테이블
  • tops_has_posts테이블.

내가 내 위에 있는 상의를 회수할 때tops테이블 또한 검색합니다.posts정상과 관계에 있어서하지만 이 게시물들을 특정한 순서로 검색하려면 어떻게 해야 할까요? 그래서 추가합니다.range내 피벗 테이블의 필드tops_has_posts그리고 제가 Expellent를 이용해서 결과대로 주문하려고 하는데 안 되네요.

나는 이것을 시도합니다.

$top->articles()->whereHas('articles', function($q) {
    $q->orderBy('range', 'ASC');
})->get()->toArray();

그리고 이건..

$top->articles()->orderBy('range', 'ASC')->get()->toArray();

둘 다 필사적인 시도였습니다.

미리 감사드립니다.

두 가지 방법이 있습니다. 하나는 다음을 지정하는 것입니다.table.field, other는 Expellent 별칭을 사용합니다.pivot_field사용하는 경우withPivot('field'):

// if you use withPivot
public function articles()
{
  return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range');
}

// then: (with not whereHas)
$top = Top::with(['articles' => function ($q) {
  $q->orderBy('pivot_range', 'asc');
}])->first(); // or get() or whatever

웅변 별칭은 에 제공된 모든 필드를 의미하므로 이렇게 하면 됩니다.withPivot~하듯이pivot_field_name.

이제 일반 솔루션:

$top = Top::with(['articles' => function ($q) {
  $q->orderBy('tops_has_posts.range', 'asc');
}])->first(); // or get() or whatever

// or:
$top = Top::first();
$articles = $top->articles()->orderBy('tops_has_posts.range', 'asc')->get();

이렇게 하면 관련 쿼리의 순서가 달라집니다.

참고: 이런 식으로 이름을 붙여서 인생을 힘들게 하지 마세요.posts꼭 그렇지만은 않습니다articles, 이것이 꼭 필요하지 않다면 저는 하나 또는 다른 이름을 사용할 것입니다.

Laravel 8.17.2+의 경우 사용할 수 있습니다.::orderByPivot().

https://github.com/laravel/framework/releases/tag/v8.17.2

Laravel 5.6+(이전 버전은 확실하지 않음)에서는 다음을 사용하는 것이 편리합니다.

public function articles()
{
  return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range')->orderBy('tops_has_posts.range');
}

이런 경우에는 언제든지 전화를 할 때articles, 그들은 자동적으로 분류될 것입니다.range소유물.

Laravel 5.4에서 나는 잘 작동하는 다음과 같은 관계가 있습니다.Set어떤 모델을belongsToManyJob모델:

public function jobs()
{
    return $this->belongsToMany(Job::class, 'eqtype_jobs')
        ->withPivot(['created_at','updated_at','id'])
        ->orderBy('pivot_created_at','desc');
}

위 관계는 모두 반환합니다.jobs지정된Set피벗 테이블의 주문에 의해 가입되었습니다(eqtype_jobs) 필드created_atDESC.

SQL 인쇄물은$set->jobs()->paginate(20)다음과 같습니다.

select
  `jobs`.*, `eqtype_jobs`.`set_id` as `pivot_set_id`,
  `eqtype_jobs`.`job_id` as `pivot_job_id`,
  `eqtype_jobs`.`created_at` as `pivot_created_at`,
  `eqtype_jobs`.`updated_at` as `pivot_updated_at`,
  `eqtype_jobs`.`id` as `pivot_id`
from `jobs`
inner join `eqtype_jobs` on `jobs`.`id` = `eqtype_jobs`.`job_id`
where `eqtype_jobs`.`set_id` = 56
order by `pivot_created_at` desc
limit 20
offset 0

다음을 시도해 보십시오.

$top->articles()->orderBy('pivot_range','asc')->get();

SQL 조회를 출력하는 경우belongsToMany관계, 당신은 피벗 테이블의 열 이름들이 다음을 사용하는 것을 발견할 것입니다.pivot_접두사를 새 별칭으로 지정합니다.

예를들면,created_at,updated_at피벗 테이블에서.pivot_created_at,pivot_updated_at가명들그래서.orderBy메소드는 대신 이러한 별칭을 사용해야 합니다.

여기에 당신이 그렇게 할 수 있는 방법의 예가 있습니다.

class User {
    ...
    public function posts(): BelongsToMany {
        return $this->belongsToMany(
                   Post::class, 
                   'post_user', 
                   'user_id', 
                   'post_id')
               ->withTimestamps()
               ->latest('pivot_created_at');
    }
    ...
}

사용가능orderBy쓰지 않고latest당신이 원한다면 방법.위의 예에서,post_user는 피벗 테이블이며, 주문을 위한 열 이름은 지금 입니다.pivot_created_at아니면pivot_updated_at.

다음을 사용할 수 있습니다.

    public function keywords() {
    return $this->morphToMany(\App\Models\Keyword::class, "keywordable")->withPivot('order');
}
public function getKeywordOrderAttribute() {
    return $this->keywords()->first()->pivot->order;
}

sortby를 가져온 후 키워드 속성을 모델에 추가하여 사용합니다.

$courses->get()->append('keyword_order')->sortBy('keyword_order');

언급URL : https://stackoverflow.com/questions/26551078/how-to-order-by-pivot-table-data-in-laravels-eloquent-orm

반응형