2016-10-17 8 views
0

Ich habe eine Testseite, wo ich eine recipes, ingredients und ingredient_uses Tabellen habe. Jedes Rezept "verwendet" Zutaten in verschiedenen Mengen und anders zubereitet (z. B. gehackt, in Scheiben geschnitten, gehackt, gerieben), so dass die ingredient_uses Tabelle die recipe_id und die ingredient_id mit den anderen variablen Informationen verfolgt.Laravel Beziehung rückwärts

Die Beziehungen wie folgt aussehen:

Rezeptmodell:

public function ingredients() 
{ 
    return $this->hasManyThrough('App\Ingredient', 'App\IngredientUse'); 
} 

public function ingredientUses() 
{ 
    return $this->hasMany('App\IngredientUse'); 
} 

Ingredient_Use Modell:

public function ingredient() 
{ 
    return $this->hasOne('App\Ingredient'); 
} 

public function recipe() 
{ 
    return $this->belongsTo('App\Recipe'); 
} 

Ingredient Modell:

public function recipe() 
{ 
    return $this->belongsToMany('App\Ingredient'); 
} 

Ich dachte, ich wollte eine hasManyThrough Beziehung vom Rezept zur Zutatentabelle, mit der Zutat_uses als die mittlere Tabelle. Aber die SQL ist falsch:

SELECT `ingredients`.*, `ingredient_uses`.`recipe_id` 
FROM `ingredients` 
INNER JOIN `ingredient_uses` 
    ON `ingredient_uses`.`id` = `ingredients`.`ingredient_use_id` 
WHERE `ingredient_uses`.`recipe_id` = 1 

Dies ist, was ich denke, ich will:

SELECT `ingredients`.*, `ingredient_uses`.`recipe_id` 
FROM `ingredients` 
INNER JOIN `ingredient_uses` 
    ON `ingredient_uses`.`ingredient_id` = `ingredients`.`id` 
WHERE `ingredient_uses`.`recipe_id` = 1 

Gibt es eine entsprechende Beziehung, die ich verwenden sollte?

+0

Warten - ich dachte 'Ingredient_Use' sollte' belongsTo' Zutaten? Warum ist es hasOne? :) –

+0

Ich denke, du solltest in "Ingredient Model", "https://laravel.com/docs/5.3/eloquent-relationships#many-to-many", "goesToMany" verwenden – Borna

Antwort

0

in Ingredient Modell

class Ingredient extends Model 
{ 


    public function recipe(){ 

      return $this->belongsToMany(Recipe::class, 'ingredient_uses', 'ingredient_id', 'recipe_id'); 
    } 

} 

andere Modelle leer, das ist meine sein es keine Funktion innerhalb Rezeptmodell und Ingredient Modell sein würde.

u können die Dokumentation über dieses https://laravel.com/docs/5.3/eloquent-relationships#many-to-many

2

Das erste, was sehen - Sie Ingredient_Use Modell nicht brauchen. Modellbeispiele:

class Ingredient extends Model 
{ 
    /** 
    * @var string 
    */ 
    protected $table = 'ingredients'; 

    /** 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 
    */ 
    public function recipes() 
    { 
     return $this->belongsToMany(Recipe::class, 'recipes_ingredients', 'ingredient_id'); 
    } 
} 




class Recipe extends Model 
{ 
    /** 
    * @var string 
    */ 
    protected $table = 'recipes'; 

    /** 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 
    */ 
    public function ingredients() 
    { 
     return $this->belongsToMany(Ingredient::class, 'recipes_ingredients', 'recipe_id')->withPivot('additional', 'fields'); 
    } 
} 

Zugriff auf zusätzliche Felder Beispiel

$recipe->pivot->additional;