라라벨이 연애를 주문하다
나는 특정 게시물의 작성자가 올린 모든 코멘트를 반복하고 있다.
foreach($post->user->comments as $comment)
{
echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
}
이거면 알 수 있어요
I love this post (3)
This is a comment (5)
This is the second Comment (3)
위의 목록을 3, 3, 5로 주문하려면 post_id로 주문하려면 어떻게 해야 합니까?
쿼리 함수와의 관계를 확장할 수 있습니다.
<?php
public function comments()
{
return $this->hasMany('Comment')->orderBy('column');
}
[댓글 연발 편집]
<?php
class User
{
public function comments()
{
return $this->hasMany('Comment');
}
}
class Controller
{
public function index()
{
$column = Input::get('orderBy', 'defaultColumn');
$comments = User::find(1)->comments()->orderBy($column)->get();
// use $comments in the template
}
}
디폴트 사용자 모델+단순 컨트롤러의 예.코멘트 리스트를 취득할 때는 입력::get()에 따라 orderBy()를 적용합니다(입력체크를 몇 가지 실행해 주세요).
다음 작업도 가능합니다.
$sortDirection = 'desc';
$user->with(['comments' => function ($query) use ($sortDirection) {
$query->orderBy('column', $sortDirection);
}]);
그러면 관련된 각 코멘트레코드에서 임의의 로직을 실행할 수 있습니다.안에 다음과 같은 것들이 있을 수 있습니다.
$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);
사용.sortBy...
도움이 될 거야
$users = User::all()->with('rated')->get()->sortByDesc('rated.rating');
이 솔루션을 사용해 보십시오.
$mainModelData = mainModel::where('column', $value)
->join('relationModal', 'main_table_name.relation_table_column', '=', 'relation_table.id')
->orderBy('relation_table.title', 'ASC')
->with(['relationModal' => function ($q) {
$q->where('column', 'value');
}])->get();
예를 들어:
$user = User::where('city', 'kullu')
->join('salaries', 'users.id', '=', 'salaries.user_id')
->orderBy('salaries.amount', 'ASC')
->with(['salaries' => function ($q) {
$q->where('amount', '>', '500000');
}])->get();
에서 열 이름을 변경할 수 있습니다.join()
를 참조해 주세요.
저는 관계분야에서 주문하기 위한 특성을 만들었습니다.상태 관계가 있는 웹샵 주문에서 이 문제가 발생했으며 상태 필드에는 이름 필드가 있습니다.
유창한 모델의 조인(join)은 조인(join)이 아니기 때문에 주문이 불가능합니다.첫 번째 쿼리가 완료된 후 실행되는 쿼리입니다.그래서 저는 릴 핵을 만들어 웅변적인 관계 데이터(테이블, 결합 키, 포함된 경우 추가 위치 등)를 읽고 메인 쿼리에 결합했습니다.이것은 일대일 관계에서만 작동합니다.
첫 번째 단계는 특성을 생성하여 모델에 사용하는 것입니다.그 특성에는 두 가지 기능이 있습니다.첫 번째:
/**
* @param string $relation - The relation to create the query for
* @param string|null $overwrite_table - In case if you want to overwrite the table (join as)
* @return Builder
*/
public static function RelationToJoin(string $relation, $overwrite_table = false) {
$instance = (new self());
if(!method_exists($instance, $relation))
throw new \Error('Method ' . $relation . ' does not exists on class ' . self::class);
$relationData = $instance->{$relation}();
if(gettype($relationData) !== 'object')
throw new \Error('Method ' . $relation . ' is not a relation of class ' . self::class);
if(!is_subclass_of(get_class($relationData), Relation::class))
throw new \Error('Method ' . $relation . ' is not a relation of class ' . self::class);
$related = $relationData->getRelated();
$me = new self();
$query = $relationData->getQuery()->getQuery();
switch(get_class($relationData)) {
case HasOne::class:
$keys = [
'foreign' => $relationData->getForeignKeyName(),
'local' => $relationData->getLocalKeyName()
];
break;
case BelongsTo::class:
$keys = [
'foreign' => $relationData->getOwnerKeyName(),
'local' => $relationData->getForeignKeyName()
];
break;
default:
throw new \Error('Relation join only works with one to one relationships');
}
$checks = [];
$other_table = ($overwrite_table ? $overwrite_table : $related->getTable());
foreach($keys as $key) {
array_push($checks, $key);
array_push($checks, $related->getTable() . '.' . $key);
}
foreach($query->wheres as $key => $where)
if(in_array($where['type'], ['Null', 'NotNull']) && in_array($where['column'], $checks))
unset($query->wheres[$key]);
$query = $query->whereRaw('`' . $other_table . '`.`' . $keys['foreign'] . '` = `' . $me->getTable() . '`.`' . $keys['local'] . '`');
return (object) [
'query' => $query,
'table' => $related->getTable(),
'wheres' => $query->wheres,
'bindings' => $query->bindings
];
}
이것은 웅변 데이터를 읽는 "검출" 기능입니다.
두 번째:
/**
* @param Builder $builder
* @param string $relation - The relation to join
*/
public function scopeJoinRelation(Builder $query, string $relation) {
$join_query = self::RelationToJoin($relation, $relation);
$query->join($join_query->table . ' AS ' . $relation, function(JoinClause $builder) use($join_query) {
return $builder->mergeWheres($join_query->wheres, $join_query->bindings);
});
return $query;
}
쿼리 내에서 사용할 모델에 스코프를 추가하는 기능입니다.모델의 특성을 사용하면 다음과 같이 사용할 수 있습니다.
Order::joinRelation('status')->select([
'orders.*',
'status.name AS status_name'
])->orderBy('status_name')->get();
언급URL : https://stackoverflow.com/questions/18143061/laravel-orderby-on-a-relationship
'programing' 카테고리의 다른 글
오류 메시지 "Strict standards:변수만 참조로 전달해야 합니다." (0) | 2022.11.14 |
---|---|
yii2에는 고정 연결 옵션이 있습니까? (0) | 2022.11.14 |
SQL 파일을 DBeaver로 가져오기 (0) | 2022.11.14 |
오프라인으로 패키지를 설치하는 방법 (0) | 2022.11.14 |
i18n을 사용한vue 3 vite의 국제화 (0) | 2022.11.14 |