Ошибка использования addSelect для подзапросов в Laravel 6 - PullRequest
0 голосов
/ 09 января 2020

Переход к Laravel 6 Я пытаюсь использовать addSelect для подзапросов и избавляться от DB :: raw () с помощью, поэтому я пытаюсь переделать запрос:

$taskList         = Task
    ::getByIsHomepage($is_homepage)
    ->getByStatus($viewedTasks)

    ->leftJoin('users', 'users.id', '=', 'tasks.leader_id')
    ->leftJoin('categories', 'categories.id', '=', 'tasks.category_id')
    ->orderBy('tasks.' . $order_by, $order_by_direction)
    ->select(
        'tasks.*',
        'users.name as leader_name',
        'categories.name as category_name',
        'categories.slug as category_slug',
        \DB::raw(' ( select count(' . $prefix . 'events.id) from ' . $prefix . 'events where ' . $prefix . 'events.task_id = ' .
             $prefix . 'tasks.id ) as events_count')

    )
    ->offset($limit_start)
    ->take($tasks_per_page)
    ->get()     

в

$taskList         = Task
    ::getByIsHomepage($is_homepage)
    ->getByStatus($viewedTasks)
    ->leftJoin('users', 'users.id', '=', 'tasks.leader_id')
    ->leftJoin('categories', 'categories.id', '=', 'tasks.category_id')
    ->orderBy('tasks.' . $order_by, $order_by_direction)
    ->select(
        'tasks.*',
        'users.name as leader_name',
        'categories.name as category_name',
        'categories.slug as category_slug'
    )->addSelect(['events_count' => Event::count('id')
        ->whereColumn('events.task_id', 'tasks.id')
    ])

    ->offset($limit_start)
    ->take($tasks_per_page)
    ->get()

и получил ошибку:

Symfony\Component\Debug\Exception\FatalThrowableError
Call to a member function whereColumn() on integer

Какой правильный путь?

MODIFIED

Я переделал как:

$taskList         = Task
    ::getByIsHomepage($is_homepage)
    ->getByStatus($viewedTasks)
    ->leftJoin('users', 'users.id', '=', 'tasks.leader_id')
    ->leftJoin('categories', 'categories.id', '=', 'tasks.category_id')
    ->orderBy('tasks.' . $order_by, $order_by_direction)
    ->select(
        'tasks.*',
        'users.name as leader_name',
        'categories.name as category_name',
        'categories.slug as category_slug'

    )->addSelect(['events_count' => Event
        ::whereColumn('events.task_id', 'tasks.id')
        ->count('id')
    ])

и получил ошибку

:
Illuminate\Database\QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tsk_tasks.id' in 'where clause' (SQL: select count(`id`) as aggregate from `tsk_events` where `tsk_events`.`task_id` = `tsk_tasks`.`id`)

, и это странно для меня, так как у меня есть таблица tsk_tasks с полем id. Как это исправить?

Спасибо!

1 Ответ

1 голос
/ 09 января 2020

Как упомянуто в комментариях, вызов count() фактически выполнит запрос и вернет результат, который не соответствует желаемому в этом случае.

Чтобы добиться того, что вам нужно, с помощью addSelect() для подсчета вам нужно добавить необработанную часть подсчета:

->addSelect([
    'events_count' => Event::selectRaw('count(*)')->whereColumn('events.task_id', 'tasks.id'),
])

При этом я бы предложил добавить следующее к вашей Task модели (если вы не уже):

public function events()
{
    return $this->hasMany(Event::class);
}

Тогда вы сможете использовать метод withCount () :

$taskList         = Task
    ::getByIsHomepage($is_homepage)
    ->getByStatus($viewedTasks)
    ->leftJoin('users', 'users.id', 'tasks.leader_id')
    ->leftJoin('categories', 'categories.id', 'tasks.category_id')
    ->orderBy('tasks.' . $order_by, $order_by_direction)
    ->select(
        'tasks.*',
        'users.name as leader_name',
        'categories.name as category_name',
        'categories.slug as category_slug'
    )
    ->withCount('events') //<-- this bit
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...