Laravel查询模型关系

时间:2014-05-26 10:26:02

标签: php laravel model laravel-4

我仍然在使用laravel模型。起初我尝试使用表格来完成所有操作,但这并不聪明,我会错过许多laravel函数。

我有以下设置

  • ProjectTwitterStatus链接项目和推特状态。
  • TwitterStatus拥有Twitter状态的所有详细信息,并且有一个唯一的ID('发布于'推文的日期时间是其中的详细信息)
  • TwitterRetweets拥有TwitterStatus的ID - 实际的转推 - 以及转发状态的推文ID
  • TwitterReplies拥有TwitterStatus的ID - 即实际回复 - 和/或用户ID(如果不是对状态的回复,而是对用户的回复。)

我想要什么?使用laravel模型关系获取每个日期(DATE(datetime))的状态,转发和回复的计数。

这些是模特。

class ProjectTwitterStatus extends Eloquent {

    protected $table = 'project_twitter_statuses';

    protected $softDelete = true;

    public function twitterStatus() {
        return $this->belongsTo('TwitterStatus');
    }

    public function project() {
        return $this->belongsTo('Project');
    }
}

class TwitterStatus extends Eloquent {

    protected $table = 'twitter_statuses';

    public function twitterRetweet() {
        return $this->hasMany('TwitterRetweet');
    }

    public function twitterReply() {
        return $this->hasMany('TwitterReply');
    }

    public function twitterUser() {
        return $this->belongsTo('TwitterUser');
    }

    public function projectTwitterStatus() {
        return $this->hasMany('ProjectTwitterStatus');
    }
}

class TwitterRetweet extends Eloquent {

    protected $table = 'twitter_retweets';

    public function twitterStatus() {
        return $this->belongsTo('TwitterStatus');
    }       
}

class TwitterReply extends Eloquent {

    protected $table = 'twitter_replies';

    public function twitterStatus() {
        return $this->belongsTo('TwitterStatus');
    }

}

我使用这个获得了twitterStatuses的计数:

$twitterStatuses = TwitterStatus::has('projectTwitterStatus')
    ->groupBy(DB::raw('DATE(datetime)'))
    ->get(array(DB::raw('COUNT(id) AS tweets'),DB::raw('DATE(datetime) AS date')));

我试过这个例子来添加转推计数但是没有效果(对象中的模型apears的参考 - > array()。

$twitterStatuses = TwitterStatus::has('projectTwitterStatus')
    ->with(array('twitterRetweet' => function($query)
    {
        $query->count();
    }))
    ->groupBy(DB::raw('DATE(datetime)'))
    ->take(10)
    ->get(array(DB::raw('COUNT(id) AS tweets'),DB::raw('DATE(datetime) AS date')));

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

不是100%确定如何使用您的预期解决方案 - 假设您只想计算与twitterStatus相关的转推数量?

$count = $twitterStatus->twitterRetweet()->count();

其中$twitterStatus是已经检索过的模型 - 不是集合。

如果$twitterStatus是要迭代的集合,您还可以使用with()load()

急切加载相关模型

然后你可以迭代集合中的每个模型 - 取决于你想如何使用结果