OrderBy в другой модели после с () в Laravel - PullRequest
1 голос
/ 22 марта 2020

У меня проблема, я пытаюсь упорядочить запрос по дате в связанной таблице. У меня есть таблица с именем User и еще одна таблица с именем Posts in One-To-Many.

User::with('posts')
    ->where('last_name', 'like', $search['lastname'] . '%')
    ->where('first_name', 'like', $search['firstname'] . '%')
    ->where('email', 'like', '%' . $search['email'] . '%')
    ->whereHas('posts', function ($query) use ($search) {
        $query->where('reference', 'like', $search['reference'] . '%')
            ->orderBy('date', 'asc');
    })
    ->orderBy('posts.date', 'desc')
    ->paginate(15);

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 22 марта 2020

В настоящее время пользователь является основным субъектом, и поэтому сортировка постов будет среди постов ЭТОГО ПОЛЬЗОВАТЕЛЯ, а не глобально по всем постам. Я предполагаю, что вы хотите сделать глобальную сортировку, то есть сообщения должны быть отсортированы по дате

Попробуйте добавить новое отношение в классе пользователя

class User extends Model {
  public function rpost() {
    return $this->belongsTo(\where\ever\posts::class, 'user_id', 'id');
    //inverse mapping from user --> posts table
    //assuming posts table is using user_id column to track the ownership
    //and user table has id as it's primary key
  }
}

Затем измените код

User::with('rpost')
    ->select('posts.title'.'posts.id', 'users.name',  
           \DB::raw('(SELECT posts.date FROM posts WHERE user.id = posts.user_id ) as sort'))
    ->where('last_name', 'like', $search['lastname'] . '%')
    ->where('first_name', 'like', $search['firstname'] . '%')
    ->where('email', 'like', '%' . $search['email'] . '%')
    ->whereHas('posts', function ($query) use ($search) {
        $query->where('reference', 'like', $search['reference'] . '%');
    })
    ->orderBy('sort')
    ->paginate(15);
1 голос
/ 22 марта 2020

Вы можете использовать sortBy

 $users = User::with('posts')->get()
  ->sortBy(function($user) { 
     return $user->posts->created_at;
  })

или вы можете использовать такие объединения с orderBy

  $query = User::where('last_name', 'like', $search['lastname'] . '%')->where(
        'first_name',
        'like',
        $search['firstname'] . '%'
    )->where('customers.email', 'like', '%' . $search['email'] . '%');
    $query = $query->join('posts', 'posts.user_id','=','users.id');
    $query = $query->select('posts*','users.*');
    $query = $query->orderBy('posts.created_at','asc');
    $record = $query->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...