Hello everyone,
I’m trying to figure out AR and to use it instead of hardcoded SQL queries.
So, I had a query:
SELECT
bt.*,btc.topic_text,btc.topic_extra,ua.username
FROM
'.Table('blogs_topics').' bt,
'.Table('blogs_topics_content').' btc,
'.Table('users_accounts').' ua
WHERE
bt.blog_id=:blog_id
AND
bt.topic_status = "published"
AND
btc.topic_id=bt.topic_id
AND
ua.id=bt.user_id
After reading documentation, I used yiic to generate some models, and after few tries I ended up with:
$topics = blogs_topics::model()->published()->byBlog(14)->with('author','content')->findAll();
Which works great.
Next step was to do the same (take hardcoded SQL query and make it all cool with AR) with more complex SQL query:
SELECT
bt.*,btc.topic_text,btc.topic_extra,ua.username,
tr.comment_count_last,
b.*,
tqv.voted_user_id
FROM
'.Table('blogs_topics').' bt
LEFT JOIN '.Table('blogs_topics_read').' tr ON (tr.topic_id=bt.topic_id AND tr.user_id=:user_id)
LEFT JOIN '.Table('blogs_topics_question_vote').' tqv ON (tqv.topic_id=bt.topic_id AND tqv.voted_user_id=:user_id),
'.Table('blogs_topics_content').' btc,'.Table('users_accounts').' ua, '.Table('blogs').' b
WHERE
bt.blog_id=:blog_id
AND
((bt.user_id=:user_id AND (bt.topic_status = "published" OR bt.topic_status = "draft")) OR bt.topic_status = "published")
AND
btc.topic_id=bt.topic_id
AND
ua.id=bt.user_id
AND b.blog_id=bt.blog_id ORDER BY bt.topic_date_add DESC
But i have no idea how to do it. Where should i move
LEFT JOIN '.Table('blogs_topics_read').' tr ON (tr.topic_id=bt.topic_id AND tr.user_id=:user_id)
and
LEFT JOIN '.Table('blogs_topics_question_vote').' tqv ON (tqv.topic_id=bt.topic_id AND tqv.voted_user_id=:user_id)
blogs_topics_read is a table where I keep track of which topics have been already read by user. It can be empty (left join). Te same with blogs_topics_question_vote table
But i just can’t get it - which models should use what kind of relations()?
Please, help me!