Laravel 5

Soucis pour récupération article avec condition spéciale

  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    Bonsoir à tous

    Je suis en train de préparer une récupération d'article. Jusque là, pas de soucis, j'y arrive.

    <?php
    $posts = \App\Post::published()
    ->with('image')
    ->whereNotNull('main_img')
    ->where('publish_date', '>=', date('Y-m-d H:i:s', strtotime('- '. $from_post .' days')))
    ->orderBy('priority', 'desc')
    ->orderBy('publish_date', 'desc')
    ->take(8)
    ->get();
    ?>

    Mon "$from_post" a une valeur de 1.

    Hors, je veux rajouter une condition mais je n'arrive pas à la formulaire. J'ai essayé de la faire en sql directement mais je n'y arrive pas. Je vais vous expliquer, je pense que vous pourrez m'aiguiller.
    Chaque article appartienne à une ville (city_id). Je souhaiterais selectionner tous les articles datant de la veille mais qu'il n'y ait qu'une seule ville identique. En gros, si j'ai dans la même journée, X articles lié à Paris, ne sélectionner qu'un seul article. Je ne sais pas si j'ai été assez clair.
    Si l'un de vous pourrait me donner un coup de main. Je serais très reconnaissant.

    Bonne soirée à tous

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2274

    Salut,

    En SQL on utiliserait DISTINCT. Le query builder dispose aussi de la méthode distinct. Il doit être possible d'établir une contrainte sur la relation (whereHas) en utilisant distinct.

  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    Bonjour et merci pour cette réponse. J'ai essayé de me schématiser la requete SQL en brut mais je n'arrive pas à visualiser la requete.
    Je contine mes recherches, merci pour ce retour.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Cela manque de la table city et de group by, si t nous donnes les trois tables..on peux regarder à t'écrire la requête SQL.

  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    J'ai une table post qui contient un champs city_id, et une autre table cities qui possède un id.

    J'essai de la faire en SQL brut pour ensuite la faire pour laravel

    SELECT * FROM posts LEFT JOIN
    cities ON posts.city_id=cities.id
    GROUP BY cities.id
  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Si j'ai bien l'ensemble des éléments, ceci donc :

    SELECT * FROM posts
    INNER JOIN cities
    ON posts.city_id=cities.id
    INNER JOIN image
    ON image.id = posts.image_id
    WHERE posts.publish_date >= date('Y-m-d H:i:s', strtotime('- '. $from_post .' days'))
    ORDER BY priority,publish_date desc
    GROUP BY cities.id
  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    @MaitrePylos, merci mais je ne cherche pas à faire une liaison avec la table Cities.
    Je cherche à récupérer les articles (à savoir 8) mais avec des villes (city_id) différents.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    et bien enlève les cities


    SELECT * FROM posts

    INNER JOIN image

    ON image.id = posts.image_id

    WHERE posts.publish_date >= date('Y-m-d H:i:s', strtotime('- '. $from_post .' days'))

    ORDER BY priority,publish_date desc

    GROUP BY cities_id
  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    Bonsoir

    Me revoila après quelques jours de sur-booking. J'ai tester cette requette mais cela ne marche pas.

    //requête
    SELECT * FROM posts
    INNER JOIN image
    ON image.id = posts.image_id
    WHERE posts.publish_date >= '2018-10-03 18:00:00'
    ORDER BY priority,publish_date desc
    GROUP BY city_id

    et j'ai en retour:

    MySQL a répondu : Documentation
    #1064 - Erreur de syntaxe près de 'GROUP BY city_id LIMIT 0, 25' à la ligne 6

    Je continue à chercher. Bonne soirée.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Vou notez ceci dans la requête : GROUP BY city_id
    Et l'erreur est sur un pluriels : cities_id
    Lequel des deux se retrouve dans la db ?

  • Avatar de lemirandais
    Membre depuis :
    28/07/2018
    Messages :
    8

    @MaitrePylos, merci, j'ai en effet fait un mauvais copier coller

    J'ai finalement trouvé:

    SELECT * FROM posts WHERE publish_date >= '2018-10-03 18:00:00' GROUP BY city_id ORDER BY posts.city_id ASC LIMIT 0, 10

Vous ne pouvez pas répondre à ce sujet.