2017-02-13 2 views
3

Я хочу создать нечто вроде псевдонима для подзапроса SQL, поэтому я могу использовать его как простое поле SQL. Например, у меня есть 3 таблицы: user, user_comments и user_comment_answers. Если я хочу, чтобы получить количество всех ответов на комментарий текущего пользователя, я буду делать что-то вроде этого:Создайте псевдоним подзапроса, чтобы использовать его в Laravel Query Builder.

SELECT 
    COUNT(*) as comment_answers_count 
    FROM user_comment_answers 
    WHERE user_comment_id IN (SELECT id FROM user_comments WHERE user_id = :id) 

Теперь я хочу сделать Laravel рассматривать это как простую область user стола, так что я могу просто делать такие вещи, как это:

echo Auth::user()->comment_answer_count 

или как это

$popularUsers = User::where('comment_answer_count', '>=', 100) 

Как я могу добиться этого в Laravel 5.4?

+0

зрения этой ссылка надеется, что это поможет http://itsolutionstuff.com/post/laravel-how-to-make-subquery-in -select-statementexample.html –

+0

@recoverymen спасибо, но я знаю о необработанных запросах. Я хочу, чтобы инкапсулировать этот подзапрос где-то в таблице SQL или модели и использовать его с помощью псевдонима, как и любое другое простое поле SQL. –

+0

извините, я не понимаю, чего вы хотите достичь. –

ответ

0

Закончен с созданием SQL View следующим образом:

CREATE VIEW user_with_comments AS 
SELECT user.*, (
    SELECT 
    COUNT(*) 
    FROM user_comment_answers 
    WHERE user_comment_id IN (SELECT id FROM user_comments WHERE user_id = user.id) 
) as comment_answers_count 
FROM user 

Я думаю, это даже можно перегрузить красноречивые методы для чтения из одной таблицы и записи на другой, так как именно этот режим SQL только для чтения, но в моем случае доступ только для чтения достаточно, так Я только что создал другую модель UserWithComments и, наконец, можно использовать его как

$popularUsers = UserWithComments::where('comment_answer_count', '>=', 100) 
2

Попробуйте

$users = Auth::withCount('comments')->get(); 

Теперь все пользователи имеют свойство comments_count

foreach($users as $user) { 
    echo $user->comments_count; 
} 

Предполагая, что вы определили отношения в моделях User и Comment.

Update

По вашему первому комментарию, что вы хотите аксессор

public function getCommentAnswerCountAttribute($value) { 
    //define your query here 
} 

Больше информации здесь: https://laravel.com/docs/5.4/eloquent-mutators#defining-an-accessor

Надеется, что это дает вам подсказку в поиске вашего решения

+0

Собственно, это способ получить 'comments_count', а не' comment_answer_count'. Таблица 'user_comment_answers' не имеет прямой связи с таблицей' user', поэтому этот метод не будет работать. Однако это только пример, и мой фактический случай имеет более сложный запрос. –

+0

Проверьте мое обновление. – EddyTheDove

+0

Хорошая точка, это решает часть задачи. Я все еще не могу использовать 'comment_answer_count' в' where', но я могу просто получить доступ к нему из модели. –