使用select时,关系不加载

时间:2015-07-16 14:17:47

标签: php laravel eloquent laravel-5

简介
你好。我正在构建一个FacebookFeedParser,目前我正在尝试在Controller中构建一个方法,列出从今天到用户的最佳帖子/喜欢比例的Facebook页面。为此,我在纯SQL中构建了以下查询

super

我现在想做的是将此查询转换为Laravel / Eloquent。

当前状态
我的项目中有以下课程

控制器SELECT pa.facebook_name, COUNT(po.id) AS postCount, SUM(likes) AS likes, SUM(likes)/COUNT(po.id) AS likesPerPost FROM facebook_posts po INNER JOIN facebook_pages pa ON pa.id = po.facebook_page_id WHERE CONVERT_TZ(`facebook_created_time`, 'UTC', 'Europe/Berlin') > '2015-07-16 00:00:00' GROUP by facebook_page_id ORDER BY SUM(likes)/COUNT(po.id) DESC; PageController
模型PostControllerFacebookPostFacebookPage

BaseModelFacebookPost模型都是这样定义他们的关系

FacebookPage

FacebookPage

/** * Defines the relation between FacebookPage and FacebookPost * One page can have multiple posts * * @see FacebookPage * @see FacebookPost * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function posts() { return $this->hasMany(FacebookPost::class); }

FacebookPost

在BaseModel中,我定义了一个范围,它将在项目中多次使用

/**
 * Defines the association of this object with FacebookPage
 * One facebook_post belongs to one facebook_page
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function page()
{
    return $this->belongsTo(FacebookPage::class, 'facebook_page_id');
}

这是我为了获得这些帖子而构建的查询,使用过滤器

/**
 * Query scope to get the database values for today
 *
 * @param $query
 * @return mixed
 */
public function scopeToday($query)
{
    return $query->whereRaw('CONVERT_TZ(`'. $this->createDateColumn .'`, "UTC", "'. env('APP_TIMEZONE') .'") > "' . Carbon::today()->toDateTimeString() . '"');
}

问题
我目前遇到的问题是,当我尝试重建上述查询时,我没有得到我想要的所有字段。只要我向$posts = App\Models\FacebookPost::with('page') ->selectRaw('COUNT(id) AS postCount, SUM(likes) AS likes, SUM(likes)/COUNT(id) AS likesPerPost') ->today() ->groupBy('facebook_page_id') ->orderByRaw('SUM(likes)/COUNT(id) DESC') ->get(); 添加selectBuilder数组的索引relations就为空。如果我省略page方法,我将获得FacebookPage,但我希望拥有这些特定字段

现在我得到了一个对象。我想这是因为我正在使用select对吗?是不是可能只获得我想要的领域?我期待的结果应该是这样的(每行)

Eloquent Builder

我也试过这个

facebook_name    |    postCount    |    likes    |    likesPerPost

McDonalds             1000              500           0.5

我是否需要使用$posts = App\Models\FacebookPost::with(['page' => function($query) { $query->select('facebook_name'); }]) ->selectRaw('COUNT(id) AS postCount, SUM(likes) AS likes, SUM(likes)/COUNT(id) AS likesPerPost') ->today() ->groupBy('facebook_page_id') ->orderByRaw('SUM(likes)/COUNT(id) DESC') ->get(); 类而不是Eloquent?或者这个问题的最佳解决方案是什么?

替代解决方案

DB
然而,这是有效的。这是我的用例的正确解决方案吗?我只想问一下在这里使用Eloquent是否有意义,因为我并不是真的想要获取一个对象,而是来自多个来源的数据。

1 个答案:

答案 0 :(得分:0)

如果您希望使用选择()指定要提取的字段列表时与('页面')有效,则需要制作确保外键在该列表中,否则Laravel无法获取相关模型。因此,在您的情况下,请确保从数据库中提取 page_id