2013-02-17 1 views
0

Мне было интересно, как я буду выполнять подзапросы в красноречиве. вот суть, содержащая подзапрос, который я хочу выполнить, и db, который я использую с красноречивой структурой модели.mysql subquery using laravel's red redquent

//the query I want to execute 
select p.title, c.total 
from posts as p, 
(select post_id as id, count(*) as total from comments group by post_id) as c 
where p.id=c.id 


//my table structures 
table posts - 
id title content 

table comments - 
id post_id content 


//eloquent models 
class Post extends Eloquent{ 
    public static $timestamps = false; 

    public function comments(){ 
     return $this->has_many('Comment', 'post_id'); 
    } 
} 

class Comment extends Eloquent{ 
    public static $timestamps = false; 

    public function post(){ 
     return $this->belongs_to('Post', 'post_id'); 
    } 
} 

В основном я хочу использовать eloquent для выполнения запроса, который содержит подзапрос. Я знаю, что могу использовать DB :: query(); метод для выполнения необработанного запроса или может попытаться использовать соединение, но я хочу придерживаться красноречия. любое архитектурное предложение приветствуется также потому, что я могу пропустить способ, которым можно следовать, используя красноречие, чтобы получить тот же результат, не используя тот же самый запрос.

благодарит заранее.

+1

Я не думаю, что это возможно. Для этого нет никаких методов. – Gargron

+0

Вам нужно будет создать собственный метод класса и использовать свободный конструктор запросов. Это будет не совсем то, что вы хотите, но будете делать то, что вам нужно. См. [Конструктор запросов по свободному запросу] (http://laravel.com/docs/database/fluent#aggregates) – Cristian

+2

Другим вариантом получения комментария является 'Post :: with ('comments')', тогда просто используйте php 'count()' на представлении. – Cristian

ответ

0

Возможно, до сих пор в Eloquent поддержки подзапроса нет. Однако вы можете попробовать:

  1. выполнить подзапрос и поместить результаты во временной таблице, а затем выполнить основной запрос со ссылкой на эту таблицу (не забудьте удалить временную таблицу)
  2. Перепишите запрос в способ, который не должен использовать подзапросы (это не всегда возможно, я предполагаю).

Для второй альтернативы ваш запрос может стать:

select p.title, count(c.id) as total 
    from posts as p 
    left join comments as c on p.id=c.id 
group by p.id 

, который я думаю, что это эквивалентно и обычно быстрее.

PS: Я не тестировал запрос, так как у меня нет таблиц, но я часто использую этот подход. Если есть опечатка, просто дайте мне знать.

+0

спасибо за помощь, но я немного изменил архитектуру и внедрил метод join() из свободного конструктора запросов. работаю точно, я хочу это прямо сейчас: D еще раз спасибо –