Laravel 4 - 加入表但只有最新一行

时间:2016-06-05 14:06:53

标签: laravel laravel-4 eloquent

我有2个表:行情,回应。

在数据表中,我显示引号,并且对于每一行,我显示响应的列数。我现在想要显示最新回复的日期,但我被阻止了:(

这是我的代码:

$quotes = Quote::select('Quotes.*', DB::raw('COUNT(Responses.id) as total_responses') )
    ->leftjoin('Responses', function($join)
    {
        $join->on('Responses.quote_id', '=', 'Quotes.id')
        ->where('Responses.state', '!=', '0');
    })
    ->groupby('Quotes.id');

是否可以使用相同的表添加另一个左连接,使用自定义查询仅选择最新的行?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您可以使用原始MAX功能。假设您的日期存储为Responses.date,代码将如下所示

$quotes = Quote::select('Quotes.*', DB::raw('COUNT(Responses.id) as total_responses'), DB::raw('MAX(CAST(Responses.date AS CHAR)) as latest') )
    ->leftjoin('Responses', function($join) {
        $join->on('Responses.quote_id', '=', 'Quotes.id')
        ->where('Responses.state', '!=', '0');
    })
    ->groupby('Quotes.id');

由于mysql错误https://bugs.mysql.com/bug.php?id=54784

,首先必须将其转换为char

答案 1 :(得分:1)

您需要在select命令中包含Responses.created_at并使用相同的列过滤它。即。

$quotes = Quote::select('Quotes.*', 'Responses.created_at as last_response_date', DB::raw('COUNT(Responses.id) as total_responses'))
    ->leftjoin('Responses', function($join)
    {
        $join->on('Responses.quote_id', '=', 'Quotes.id')
        ->where('Responses.state', '!=', '0');
    })
    ->groupby('Quotes.id')->orderBy('Responses.created_at', 'desc');