-1
votes

Comment puis-je trier une requête éloquente Laravel par une relation une à plusieurs

J'ai une table de produits et chaque produit peut avoir de nombreux stocks. Un résultat de requête que je veux réaliser est de trier les produits par champ de prix dans la table d'inventaire.

data: [
{
    id: 2,
    brand_id: 3,
    category_id: 5,
    title: "فشارسنج دیجیتال مدیسانا مدل BU 550 Connect",
    body: null,
    sales: "10",
    image: "images/product/product-image-index-5cb70c11cfaf0.jpg",
    post_on: "20",
    fast_shipping_cost: null,
    weight: "250",
    created_at: "2019-04-22 15:27:58",
    updated_at: "2019-04-22 15:27:58",
    deleted_at: null,
    inventories: [
      {
          id: 2,
          product_id: 2,
          count: "5",          
          price: "150000",
          expiration_date: null
      },    
    ]
},
{
    id: 3,
    brand_id: 1,
    category_id: 6,
    title: "سوزن تست قند خون تی دی-تین بسته 100 عددی",
    body: null,
    sales: "5",
    image: "images/product/product-image-index-5cbafe568518c.jpg",
    post_on: null,
    fast_shipping_cost: null,
    weight: "150",
    created_at: "2019-04-23 15:27:58",
    updated_at: "2019-04-23 15:27:58",
    deleted_at: null,
    inventories: [
      {
          id: 3,
          product_id: 3,
          count: "4",          
          price: "98000",
          expiration_date: null
      }
    ]
}
{
    id: 1,
    brand_id: 3,
    category_id: 5,
    title: "فشارسنج عقربه ای و گوشی پزشکی هانسون مدل وکتو",
    body: null,
    sales: "2",
    image: "images/product/product-image-index-5ca0b4607158f.jpg",
    post_on: "15",
    fast_shipping_cost: "50000",
    weight: "300",
    created_at: "2019-04-21 15:27:58",
    updated_at: "2019-04-21 15:27:58",
    deleted_at: null,
    inventories: [
      {
          id: 1,
          product_id: 1,
          count: "10",          
          price: "75000",
          expiration_date: null
      }
    ]
},
],


0 commentaires

3 Réponses :


1
votes

Je viens d'essayer cela sur mes tables et d'atteindre cet objectif, je suis utilisé joindre code> au lieu d'un avec code> sur le modèle, veuillez donc essayer cette approche:

$products = Product::with('inventories')->join('inventories as i', 'products.id', '=', 'i.product_id')
            ->where('i.count', '>', 0)
            ->orderBy('i.price') // default is asc order, but as a second parameter you can use desc if you need to.
            ->groupBy('products.id')
            ->paginate(16);


5 commentaires

Merci, mais la sortie n'est pas correcte. Je n'ai que trois produits mais en résultat montrent-moi quatre produits, le produit qui a deux inventaires est en résultat deux fois, s'il dispose de 10 inventaires, il répète ce produit 10 fois et trier ne fonctionne pas du tout si un seul produit a plus d'un inventaires.


Oui, donc je vous ai montré le moyen de trier les produits en fonction de vos conditions, j'ai modifié ma réponse que vous pouvez essayer, je crois que cela résoudra votre problème.


"SQLSTAT [42000]: Erreur de syntaxe ou violation d'accès: 1055 Expression n ° 14 de la liste de sélection n'est pas en groupe par clause et contient une colonne non progrége 'antidiabetes-db.i.id' qui n'est pas fonctionnellement dépendante de colonnes en groupe par Clause; Ceci est incompatible avec sql_mode = seulement_full_group_by (SQL: SELECT * à partir de Produits REJOIGNES INTERNES Inventaires AS I ON Produits . id = i . product_id i . compte > 0 et < Code> Produits . Supprimé_at est Null Group par Produits . ID Commande par i . Prix Limite de l'ASC 16 Décalage 0) ◀ "


Vous ne pouvez pas grouper par l'ID d'inventaire, qui vous donnera à nouveau des résultats en double si cela fonctionne avec les colonnes que vous sélectionnerez. Je vous ai montré de les regrouper par le Produits.ID .


Je groupe par produits.ID identique à votre code mais il a une erreur.



0
votes

Essayez ceci xxx

actuellement, il n'y a pas de fonction éloquente à trier par relation, vous devez effectuer une jointure à trier par rapport. N'oubliez pas non plus d'ajouter Select ('Produit. *) Lorsque vous adhérez, sinon il y a des problèmes d'anomalie dans Laravel, qui remplace l'ID principal avec l'ID de la table de jonction.


0 commentaires

0
votes

J'ai résolu ce problème:

Tout d'abord, tout ajoutez une relation hasone sur le modèle de produit: xxx pré>

puis dans le produitController: p> xxx pré>

pour paginer la collection:
Dans asp (appServiceProvider.php) sur la méthode de démarrage: p> xxx pré>

in app / support / collection.php: p>

<?php

namespace App\Support;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection
{
    public function paginate($perPage, $total = null, $page = null, $pageName = 'page')
    {
        $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);

        return new LengthAwarePaginator(
            $this->forPage($page, $perPage),
            $total ?: $this->count(),
            $perPage,
            $page,
            [
                'path' => LengthAwarePaginator::resolveCurrentPath(),
                'pageName' => $pageName,
            ]
        );
    }
}


0 commentaires