简介
你好。我正在构建一个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
模型:PostController
,FacebookPost
,FacebookPage
BaseModel
和FacebookPost
模型都是这样定义他们的关系
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();
添加select
,Builder
数组的索引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是否有意义,因为我并不是真的想要获取一个对象,而是来自多个来源的数据。
答案 0 :(得分:0)
如果您希望使用选择()指定要提取的字段列表时与('页面')有效,则需要制作确保外键在该列表中,否则Laravel无法获取相关模型。因此,在您的情况下,请确保从数据库中提取 page_id 。