创建子查询别名以在Laravel查询生成器中使用它

时间:2017-02-13 06:34:11

标签: mysql laravel laravel-5

我想创建类似SQL子查询的别名,所以我可以像普通的SQL字段一样使用它。例如,我有3个表:useruser_commentsuser_comment_answers。如果我想了解当前用户评论的所有答案,我会做这样的事情:

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中实现这一目标?

2 个答案:

答案 0 :(得分:2)

尝试

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

现在所有用户都拥有comments_count属性

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

假设您在UserComment模型中定义了关系。

<强>更新

根据您的第一条评论,您想要的是一个访问者

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

此处有更多信息:https://laravel.com/docs/5.4/eloquent-mutators#defining-an-accessor

希望这能为您提供寻找解决方案的提示

答案 1 :(得分: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

我想这甚至可以重写Eloquent方法从一个表读取并写入另一个表,因为这个特定的SQL视图是只读的,但在我的情况下只读访问就足够了,所以我&#39;我只是设置另一个模型UserWithComments,最后可以像

一样使用它
$popularUsers = UserWithComments::where('comment_answer_count', '>=', 100)
相关问题