4 votes

Laravel 4 - Joindre une table mais seulement la dernière ligne

J'ai 2 tables : Citations, Réponses.

Dans une table de données, j'affiche des citations, et pour chaque ligne, j'affiche une colonne de comptage des réponses. Je voudrais maintenant afficher la date de la dernière réponse, mais je suis bloqué :(

Voici mon code :

$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');

Est-il possible d'ajouter une autre jointure gauche avec la même table, avec une requête personnalisée pour sélectionner uniquement la dernière ligne ?

Merci de votre aide

2voto

Kaspars Points 1640

Vous pouvez utiliser les données brutes MAX fonction. En supposant que votre date soit enregistrée Responses.date le code se présentera comme suit

$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');

Il doit d'abord être transformé en caractère à cause d'un bug de mysql. https://bugs.mysql.com/bug.php?id=54784

0voto

Chibueze Opata Points 3687

Ce qu'il faut, c'est inclure Responses.created_at dans votre commande de sélection et filtrez-la en utilisant la même colonne.

$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');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X