2017-10-11 2 views
0

J'ai un tableau expenses et expense_splits. J'aimerais combiner les deux dans un ensemble de résultats. Chaque expense_splits devrait avoir ajouté des attributs de la dépense à laquelle il appartient. Il semble qu'il y ait beaucoup de façons de faire, mais aucune ne semble juste.Combinez deux tables dans un jeu de résultats avec Laravel Eloquent. fusionner/ajouter/joindre

Par exemple, un leftjoin comme ça fonctionne presque pour moi mais il supprime toutes mes dépenses id # et ne conserve que expense_splits.

$expenses = DB::table('expenses') 
      -leftJoin('expense_splits', 'expenses.id', '=', 'expense_splits.expense_id') 
      ->get(); 

, j'ai besoin Idéalement, tous les attributs de ma table de frais pour montrer à mon résultat expense_splits. Sauf si les attributs sont les mêmes sur les deux tables, alors affichez l'attribut expense_splits (qu'un jelftjoin fait pour moi ... mais il supprime mon expenses.id).

Je peux aussi fusionner/pousser mes deux collections. C'est un moyen rapide de les montrer dans un ensemble de résultats. Cependant, je ne suis pas sûr comment ajouter des attributs de dépenses à chaque expense_splits. J'ai besoin que mon expense_splits soit traité comme une dépense normale (et si une dépense a des fractionnements je ne peux pas l'avoir montré ... mais je m'inquiéterai de cela plus tard). Il n'y aura jamais un moment où je n'ai pas besoin de cela n'importe où sur mon application.

$splits = ExpenseSplit::all(); 
$expenses = Expense::all(); 

$expenses = $expenses->merge($splits); 

Je peux aussi ajouter à mon résultat ExpenseSplits, mais, honnêtement, idk où placer tel ou si elle fait même sens. J'en ai besoin placé quelque part où il s'appelle chaque fois que j'appelle Expense::all() et je ne peux pas copier & coller partout dans l'application.

$expense_split = ExpenseSplit::find(34); 
$expense_split->receipt = $expense_split->expense->receipt; 
$expense_split->receipt_html = $expense_split->expense->receipt_html; 
$expense_split->check_id = $expense_split->expense->check_id; 

Quel est le meilleur endroit pour placer ce code il est donc disponible comme simplement Expense::all() et ces divisions de ma table expense_splits sera inclus. Et bien sûr, comment puis-je faire cela en premier lieu. Il semble qu'il y ait beaucoup de façons d'y arriver.

Merci, Patryk

schéma de base de données: DÉPENSES TABLE: (Simplified) | id | expense_date | montant | project_id | reçu | paid_by | check_id

TABLE EXPENSE_SPLITS: (SIMPLIFIÉ) | id | expnese_id | montant | project_id |

+1

Pouvez-vous publier votre schéma de base de données? cela semble pouvoir être résolu en utilisant correctement les relations Eloquent (au lieu de ces requêtes de jointure/jointure à gauche). –

+0

Thant serait génial! Je l'ai ajouté ci-dessus. Ce que je cherche à la fin est d'ajouter 'expense_splits' dans mes' dépenses 'dans les vues.Donc, quand je tire ma table de dépenses (dans les vues, pas une table sql je veux dire), les divisions sont incluses ainsi que les détails de la dépense parentale. – dfeva

+0

Avez-vous utilisé les fichiers de migration de base de données Laravel pour créer les tables? et avez-vous les modèles correspondants pour chaque table? –

Répondre

0

Je ne sais pas comment vous avez fait vos modèles, mais ceci est un exemple de ce qu'il devrait ressembler à:

class Expenses extends Model 
{ 
    protected $table = 'expenses'; 

    public function splitExpenses() 
    { 
     return $this->hasMany('App\Models\ExpenseSplits'); 
    } 
} 

class ExpenseSplits extends Model 
{ 
    protected $table = 'expense_splits'; 

    public function expenses() 
    { 
     return $this->belongsTo('App\Models\Expenses'); 
    } 
} 


$expenses = Expenses::where('id', 1)->with('splitExpenses')->get(); 

donc essentiellement vos dépenses de $ devraient avoir tous les objets de dépense split si l'on existe ..

lire sur: https://laravel.com/docs/5.5/eloquent-relationships

Il n'y a pas besoin d'utiliser un DB :: tableau puisque vous utilisez Eloquent. Il prend soin de tout pour vous si vous établissez les relations correctement.