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
어떤 모델을belongsToMany
의Job
모델:
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_at
DESC.
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
'programing' 카테고리의 다른 글
Chart.js에 데이터 값을 표시하는 방법 (0) | 2023.09.24 |
---|---|
HTML에서 페이지 새로 고침 시 페이지 스크롤 위치를 맨 위로 강제 적용 (0) | 2023.09.24 |
이 C 또는 C++ 매크로가 전처리기에 의해 확장되지 않는 이유는 무엇입니까? (0) | 2023.09.24 |
스프링 3 / Postgre에서 행 삽입에서 자동 생성 키 가져오기SQL 8.4.9 (0) | 2023.09.24 |
워드프레스에서 새 게시물을 작성할 수 없는 이유는 무엇입니까?경고: 라인 716에서 /public_html/wp-admin/includes/post.php의 빈 값으로 기본 개체를 만듭니다. (0) | 2023.09.24 |