2017-10-14 8 views
0

Ich muss sagen, dass mein Code funktioniert gut, aber ich verstehe nicht, warum ... Ich möchte einige benutzerdefinierte Felder für verschiedene "Module" hinzufügen.Erklärung für meine polymorphe Beziehung

für Beispiel Ich habe 3 Tabellen: Kameras, Server und custom_fields.

Kamera & Server-Modell:

public function custom_fields() 
{ 
    return $this->morphToMany('App\Models\Camera', 'item', 'description_fields', '', 'name') 
     ->withPivot('name', 'value') 
     ->withTimestamps(); 
} 

Die Tabelle für diese Beziehung:

Schema::create('description_fields', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('item_id')->unsigned(); 
    $table->string('item_type'); 
    $table->string('name'); 
    $table->string('value'); 
    $table->timestamps(); 
}); 

ich einige Elemente über diese Leitung im Controller hinzufügen:

$camera->custom_fields()->attach($request->custom_field); 

Meine Frage ist über das Modell, warum ich schreiben:

morphToMany ('App \ Models \ Kamera', 'Artikel', 'description_fields', '', 'name')

Ich verstehe nicht, warum ich die zwei letzten Parameter angeben müssen: ' ',' Name '(ändere' Name 'durch' Wert 'und es funktioniert, aber wenn ich' 'lösche', 'Name' funktioniert nicht).

Ich habe das Dokument für die Params gelesen, aber ich verstehe immer noch nicht (ich bin kein professioneller Entwickler, aber ich lerne selbst). Wenn jemand 5 Minuten Zeit hat, um mich zu erklären, wird es geschätzt.

Vielen Dank im Voraus.

Antwort

0

Werfen Sie einen Blick auf Laravel Quellcode für die morphToMany Methode:

/** 
* Define a polymorphic many-to-many relationship. 
* 
* @param string $related 
* @param string $name 
* @param string $table 
* @param string $foreignKey 
* @param string $relatedKey 
* @param bool $inverse 
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany 
*/ 
public function morphToMany($related, $name, $table = null, $foreignKey = null, $relatedKey = null, $inverse = false) 
{ 
    $caller = $this->guessBelongsToManyRelation(); 

    // First, we will need to determine the foreign key and "other key" for the 
    // relationship. Once we have determined the keys we will make the query 
    // instances, as well as the relationship instances we need for these. 
    $instance = $this->newRelatedInstance($related); 

    $foreignKey = $foreignKey ?: $name.'_id'; 

    $relatedKey = $relatedKey ?: $instance->getForeignKey(); 

    // Now we're ready to create a new query builder for this related model and 
    // the relationship instances for this relation. This relations will set 
    // appropriate query constraints then entirely manages the hydrations. 
    $table = $table ?: Str::plural($name); 

    return new MorphToMany(
     $instance->newQuery(), $this, $name, $table, 
     $foreignKey, $relatedKey, $caller, $inverse 
    ); 
} 

Sie setzen $foreignKey auf '' und $relatedKey zu 'name'. Schauen Sie speziell an dieser Stelle:

$relatedKey = $relatedKey ?: $instance->getForeignKey(); 

Im Grunde sagt dies, wenn Sie mich ein $relatedKey es verwenden, sonst sie aus der Modellinstanz erhalten.

Wenn Sie Model.php gehen, um den Quellcode der getForeignKey Methode, um zu sehen, werden Sie zu sehen, dies führt zu einer Verkettung des Klassennamen + ‚_‘ + die Standard-Primärschlüssel (‚id‘). Dies führt zu 'camera_id'.

/** 
* Get the default foreign key name for the model. 
* 
* @return string 
*/ 
public function getForeignKey() 
{ 
    return Str::snake(class_basename($this)).'_'.$this->primaryKey; 
} 
+0

Danke für die schnelle Antwort. Es funktioniert nur, wenn ich einige Daten hinzufüge, aber wenn ich die benutzerdefinierten Felder von der Kamera bekommen will, funktioniert es nicht. Ich denke ich meine Beziehung ist nicht korrekt, aber danke, ich werde versuchen, es zu bekommen! – alexcool68

+0

Ich hatte meine Beziehung durch diese neu geschrieben: 'zurück $ this-> morphToMany ('App \ Models \ Server', 'Artikel', 'description_fields', '', 'item_id') -> withPivot ('Name' "Wert") -> withTimestamps(); ' Es funktioniert jetzt gut, aber ich muss' {{$ custom_field-> pivot-> name}}} in Blade verwenden. Es ist okay, ich verstehe es! – alexcool68

Verwandte Themen