У меня есть простая модель Eloquent (Player), и я просто хочу добавить немного данных к возвращаемым данным — сумму всех очков, начисленных игроку, о котором идет речь. Вот что я делаю:
<?php
use Illuminate\Database\Eloquent\SoftDeletingTrait;
class Player extends \Eloquent {
use SoftDeletingTrait;
protected $fillable = [];
protected $table = 'players';public function points_to_date()
{
return $this->hasMany('AwardedAction', 'player_id', 'id')->selectRaw('sum(points) as points');
}
}
?>
Вот ответ, который я получаю (обратите внимание, что points_to_date имеет значение null):
{
"data": [
{
"id": 1,
"player_id": "wooly",
"created_at": "2014-09-18 16:35:30",
"updated_at": "2014-09-18 16:35:30",
"deleted_at": null,
"points_to_date": null
}
],
"elapsed": 0.022357940673828
}
Я запускаю профилировщик для запросов SQL и вижу этот запрос:
select sum(points) as points from "awarded_actions"where "awarded_actions"."deleted_at" is null
and "awarded_actions"."id" in (1)
.. поэтому запрос выполняется (и если я запускаю его в БД, он возвращает значение для запроса, поэтому он работает), но не возвращает никаких данных.
Кто-нибудь пытался заставить L4 Eloquent загружать и возвращать агрегированное значение в качестве атрибута возвращаемых данных модели?
Вам нужно всегда select primary key and foreign key
отношения, в противном случае Eloquent не сможет сопоставить связанные модели.
Для чего вы хотите сделать это:
public function points_to_date()
{
return $this->hasMany('AwardedAction', 'player_id', 'id')
->selectRaw('player_id, sum(points) as points')
->groupBy('player_id');
}
Других решений пока нет …