2017-08-29 2 views
0

Veuillez regarder ci-dessous le code.Laravel Orderby ne travaille pas à l'intérieur d'Eloquent oùHas relation?

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date') 
      ->where("service_id", '1')->where('service_provider_id', $service_privider_id)->whereMonth('service_date', $month)->whereYear('service_date', $year) 
      ->with('account') 
      ->whereHas('account', function($qs) { 
       $qs->orderBy('restaurant_name', 'DESC'); 
      }) 
      ->get(); 

J'ai plusieurs enregistrements dans « CompletedService » et il est un identifiant parent account_id qui dans le tableau de compte. et j'ai fait avec pour compte.

Déjà ASC et DESC essayés.

Essayez de commander par whereHas mais cela n'a aucun effet sur les enregistrements. Ci-dessous la relation du modèle.

public function account() { 
    return $this->hasOne('App\Account', 'id', 'account_id'); 
} 

je ne dois pas orderBy dans le modèle parce que j'utilisé cette relation dans le temps multiples et ont besoin que l'ordre par dans cette seule requête.

Et une relations d'enregistrements de service terminées ont un seul compte. Donc, fondamentalement, j'ai besoin de trier les enregistrements de service terminés sur le champ de compte.

Sortie enter image description here

Tables

CompletedService

|id| account_id|service_id|service_provider_id|gallons_collected|service_date 
|1 | 2   | 1  | 9     | 50    | 2017-08-29 

Comptes

| id | restaurant_name| 

Toute aide sera appréciée. Merci d'avance!

Répondre

0

whereHas() utilisé pour limiter vos résultats en fonction de l'existence d'une relation.

Voir: https://laravel.com/docs/5.4/eloquent-relationships#querying-relationship-existence

Utilisez le code ci-dessous pour ajouter consraint en relation:

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date') 
     ->where("service_id", '1')->where('service_provider_id', $service_privider_id)->whereMonth('service_date', $month)->whereYear('service_date', $year) 
     ->with(['account' => function($qs) { 
      $qs->orderBy('restaurant_name', 'DESC'); 
     }])->get(); 

Voir: https://laravel.com/docs/5.4/eloquent-relationships#constraining-eager-loads

+0

cette suggestion montre une erreur avec strpos() attend que le paramètre 1 soit une chaîne, array donné –

+0

Vérifiez la mise à jour de réponse et voir le dernier lien mentionné pour plus de détails. –

+0

Avoir une idée de Laravel ou juste poster une réponse pour la réputation. J'ai besoin de réponse pour cela et trouver une erreur dans le code. Voilà pourquoi je suis posté ici. Sinon, je suis également en mesure de trouver une solution de R & D –

0

orderBy() n'a pas d'effet dans une requête whereHas(); vous devez déplacer la logique orderBy() une déclaration with():

$serviceNew = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date') 
    ->where("service_id", '1') 
    ->where('service_provider_id', $service_privider_id) 
    ->whereMonth('service_date', $month) 
    ->whereYear('service_date', $year) 
    ->with(['account' => function($qs){ 
    $qs->orderBy('restaurant_name', 'DESC'); 
    })->has('account')->get(); 

Edit: Ce qui précède est le tri Account record chaque CompletedService par restaurant_name, qui n'accomplit rien. Pour trier tous les modèles CompletedService par leur Account colonne de restaurant_name, vous aurez besoin d'une clause join():

$newService = CompletedService::selectRaw('gallons_collected as total,account_id,id,service_provider_id,service_id,service_date') 
->where('service_id', '1') 
->where('service_provider_id', $service_privider_id) 
->whereMonth('service_date', $month) 
->whereYear('service_date', $year) 
->join('accounts', 'accounts.id', '=', 'completed_services.account_id') 
->orderBy('accounts.restaurant_name'); 

Vous ne devriez pas avoir besoin de la clause plus with(), mais en utilisant le has() vous assure ne recevez pas les valeurs null s'il n'y a pas de relation.

+0

désolé mais cela ne fonctionne pas même sortie .. :( –

+0

Vous essayez de commander le modèle 'Account' ou' CompletedService'? Pouvez-vous partager le code qui produit ces résultats? –

+0

Rien de nouveau dans ce code ci-dessus je mentionne que c'est seulement la date est pour le mois et l'année en cours .. et service_provider_id est un certain nombre c'est à dire "9" –