Заказать запрос по подзапросу. Красноречивый против MySql - PullRequest
1 голос
/ 28 марта 2020

Я хотел бы получить списки, за которыми следует конкретный пользователь, и списки заказов на created_at (по дате, когда списки следовали). Не уверен, почему это не работает (упорядочить) с помощью Eloquent:

$myQuery = PlaceList::query()
   ->where('private', 0)
   ->whereHas('followers', function ($query) use ($userID) {
      $query->where('created_by_user_id', $userID);
   })
   ->orderByDesc(
      Follow::query()->select('created_at')
         ->where('created_by_user_id', $userID)
         ->where('followable_id', 'place_lists.id')
   )
   ->get()

Это то, что я получаю, когда использую dd($myQuery->toSql()):

select 
    * 
from 
    `place_lists` 
where 
    `private` = ? 
    and exists (
                select 
                   * 
                from 
                   `follows` 
                where 
                   `place_lists`.`id` = `follows`.`followable_id` 
                   and `created_by_user_id` = ? 
                   and `follows`.`deleted_at` is null
                ) 
    and `place_lists`.`deleted_at` is null 
order by (
   select 
      `created_at` 
   from 
      `follows` 
   where 
      `created_by_user_id` = ? 
      and `followable_id` = ? 
      and `follows`.`deleted_at` is null
) desc

Но когда я Заполните MySql данными, которые действительно работают:

select 
    * 
from 
    `place_lists` 
where 
    `private` = 0 
    and exists (
                select 
                   * 
                from 
                   `follows` 
                where 
                   `place_lists`.`id` = `follows`.`followable_id` 
                   and `created_by_user_id` = 13 
                   and `follows`.`deleted_at` is null
                ) 
    and `place_lists`.`deleted_at` is null 
order by (
    select 
        `created_at` 
    from 
        `follows` 
    where 
       `created_by_user_id` = 13 
       and `followable_id` = `place_lists`.`id`
       and `follows`.`deleted_at` is null
) desc

Я в замешательстве, что я делаю не так?

Ответы [ 2 ]

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

В этом запросе вы утверждаете, что followalbe_id равен 'place_lists.id'.

->orderByDesc(
    Follow::query()->select('created_at')
        ->where('created_by_user_id', $userID)
        ->where('followable_id', 'place_lists.id')
)

Для сравнения двух столбцов используйте whereColumn().

->orderByDesc(
    Follow::query()->select('created_at')
        ->where('created_by_user_id', $userID)
        ->whereColumn('followable_id', 'place_lists.id')
)
1 голос
/ 28 марта 2020

Я не уверен, что я на правильном пути, но в строке 9 вашего красноречивого компоновщика сгенерированный запрос будет использовать строку для сравнения followable_id и, следовательно, будет выглядеть так:

and `followable_id` = 'place_lists.id'

Использование DB :: raw () в вашем предложении where в строке 9 должно исправить это:

$myQuery = PlaceList::query()
   ->where('private', 0)
   ->whereHas('followers', function ($query) use ($userID) {
      $query->where('created_by_user_id', $userID);
   })
   ->orderByDesc(
      Follow::query()->select('created_at')
         ->where('created_by_user_id', $userID)
         ->where('followable_id', DB::raw('`place_lists`.`id`')) // here
   )
   ->get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...