2017-06-26 185 views
3

我有一个模型: 播放机, 播放, 下载, 轨道Laravel 5.4雄辩查询

关系:

Player has many Play and Download 
Play and Download belongs to Player 
Track has many Play and Download 

我试图找到一个查询,给我对象名单用于追踪:

Track 
--Player 
----Plays 
----Downloads 
--Player 
----Plays 
----Downloads 
--Player 
----Plays 
----Downloads 

我用它在vuejs数据表组件:

<data-tables 
    :data='data.players' 
    > 
    <el-table-column 
     prop="place_title"> 
    </el-table-column> 
    <el-table-column 
     prop="plays.length"> 
    </el-table-column> 
    <el-table-column 
     prop="downloads.length"> 
    </el-table-column> 
</data-tables> 

如果groupBy能与雄辩的对象键的作品,这将是几乎我所需要的:

$plays = $track->plays()->whereYear('created_at', $year)->whereMonth('created_at', $month)->with('player')->get(); 
$players = $plays->groupBy('player'); 

groupBy作品有一个字符串键,以便在我的问题不会有用。

+0

嗨,我可以看到三个表的结构? –

+0

玩家:[链接](http://icecream.me/uploads/5ff1dae239e5424fe4db5ca65451486c.png)播放:[链接](http://icecream.me/uploads/276e8e9611c4a31878a2a0e25ae332a6.png)下载:[链接](http:/ /icecream.me/uploads/276e8e9611c4a31878a2a0e25ae332a6.png)曲目:[链接](http://icecream.me/uploads/a629b99a589fd3a18d2d8024e6170e47.png) – fiter

+0

好的,我发布了一个答案。 –

回答

1

没有关于plays()方法和其他方面的更多信息,我能说的最好的是您发布的代码将不起作用,因为$plays是一个集合。尝试做这种方式(在这种情况下,$plays是一个查询生成器对象):

$plays = $track->plays()->whereYear('created_at', $year)->whereMonth('created_at', $month)->with('player'); 
$players = $plays->groupBy('player')->get(); 
+0

我尝试过'groupBy('plays.player_id')'但出现错误:SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚集列' muzoperator.plays.id',它在功能上依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by不兼容(SQL:select * from'plays',其中'plays'.'track_id' = 15和'plays'.'track_id'不为null,year('created_at')= 2017和month(' created_at')= 5 group by'plays'.'player_id') – fiter

1

昨天我睡着了,所以无法响应更快,但我认为你可能需要的是这样的:

// Assumes you're already fetching the track e.g $track = Track::find($id); 

$plays = $track->plays()->with('player')->get(); 
$plays = $plays->groupBy('player_id'); 

$downloads = $track->downloads()->with('player')->get(); 
$downloads = $downloads->groupBy('player_id'); 

下面的代码片段只是如何在视图页面中调用此数据的示例。 Screenshot.

<h4>Track {{ $track->id }} Plays</h4> 
<ul> 
    @foreach ($plays as $play) 
    <li>Player id:{{ $play[0]->player->id }} has played {{ count($play) }} times</li> 
    @endforeach 
</ul> 
<b>Total plays: {{ count($track->plays) }}</b> 

<h4>Track {{ $track->id }} Downloads</h4> 
<ul> 
@foreach ($downloads as $download) 
    <li>Player id:{{ $download[0]->player->id }} has downloaded {{ count($download) }} times</li> 
@endforeach 
</ul> 
<b>Total downloads: {{ count($track->downloads) }}</b> 
+0

这看起来相当不错...但我不能在我的vujs数据表组件上使用它((你可以在我编辑的问题上看到这个组件代码 – fiter

+0

其实,我不知道vuejs,但也许如果你能解释组件的目的是什么,以及你试图实现的输出...... –

+0

我期待那种来自laravel的json - [link](http ://icecream.me/uploads/6212abd2f613cfcce817d482debbbe36.png) – fiter