Laravel: Rücksendung der Namespace Besitzer eine polymorphe Beziehung

Finde ich eine Reihe von Diskussionen zu diesem aber keine eindeutige Lösung. Hier sind zwei links, obwohl ich werde alles in meiner Frage hier.

Github Issues

Laravel.io-Diskussion

Einfache Erklärung

Dies ist eine einfache Erklärung für mein problem für jemanden bereits vertraut mit Laravel ist polymorphe Beziehungen.

Bei der Verwendung von $morphClass, der Inhalt von $morphClass, die in der Datenbank gespeichert wird, wie die morph - "Typ" wird für den Klassennamen, wenn Sie versuchen, den Besitzer zu finden, der eine polymorphe Beziehung. Dies führt zu einem Fehler, da die ganze Stelle von $morphClass ist, dass es sich nicht um ein vollständig Namespace name der Klasse.

Wie definieren Sie den Klassennamen, dass die polymorphe Beziehung verwenden sollte?

Ausführlichere Erklärung

Dies ist eine ausführlichere Erklärung, die erklären, genau das, was ich versuche zu tun, und warum bin ich versucht, es zu tun mit Beispielen.

Bei der Verwendung von Polymorphen Beziehungen in Laravel, was wird gespeichert, wie die "morph_type" - Typ in der Datenbank wird davon ausgegangen, dass die Klasse.

So, in diesem Beispiel:

class Photo extends Eloquent {

    public function imageable()
    {
        return $this->morphTo();
    }

}

class Staff extends Eloquent {

    public function photos()
    {
        return $this->morphOne('Photo', 'imageable');
    }

}

class Order extends Eloquent {

    public function photos()
    {
        return $this->morphOne('Photo', 'imageable');
    }

}

Die Datenbank würde so Aussehen:

staff

 - id - integer
 - name - string

orders

 - id - integer
 - price - integer

photos

 - id - integer
 - path - string
 - imageable_id - integer
 - imageable_type - string

Nun die erste Reihe von Fotos, die könnte wie folgt Aussehen:

id,Pfad,imageable_id,imageable_type

1,Bild.png -, 1 -, Personal -

Nun kann ich entweder den Zugriff auf die Foto aus einem Stab-Modell oder ein Mitarbeiter ein Foto-Modell.

//Find a staff member and dump their photos
$staff = Staff::find(1);

var_dump($staff->photos);

//Find a photo and dump the related staff member
$photo = Photo::find(1);

var_dump($photo->imageable);

So weit So gut. Allerdings, wenn ich namespace-ich laufen in ein problem.

namespace App/Store;
class Order {}

namespace App/Users;
class Staff {}

namespace App/Photos;
class Photo {}

Nun was ist gesichert in meiner Datenbank ist diese:

id,Pfad,imageable_id,imageable_type

1,Bild.png,1,App/Benutzer/Mitarbeiter

Aber ich will nicht, dass. Das ist eine schreckliche Idee, um die volle Klasse in einem Namespace befinden, Namen in der Datenbank gespeichert, so!

Glücklicherweise Laravel hat eine option, um ein $morphClass variable. Etwa so:

class Staff extends Eloquent {

    protected $morphClass = 'staff';

    public function photos()
    {
        return $this->morphOne('Photo', 'imageable');
    }

}

Nun die Zeile in meiner Datenbank wird so Aussehen, das ist genial!

id,Pfad,imageable_id,imageable_type

1,Bild.png -, 1 -, Personal -

Und immer die Fotos von einem Mitarbeiter funktioniert sehr gut.

//Find a staff member and dump their photos
$staff = Staff::find(1);

//This works!
var_dump($staff->photos);

Jedoch die polymorph-Zauber zu finden, der Besitzer des Fotos nicht funktioniert:

//Find a photo and dump the related staff member
$photo = Photo::find(1);

//This doesn't work!
var_dump($photo->imageable);

//Error: Class 'staff' not found

Vermutlich muss es eine Möglichkeit zu informieren, die polymorphe Beziehung, was classname zu verwenden, wenn $morphClass aber ich kann nicht finden jede Bezugnahme auf, wie diese Arbeit sollte in den docs, in den source-code oder über Google.

Hilfe?

  • Hast du versucht, pass, $this->morphOne () - Modell-Namen mit namespace?
  • Welches argument würde es sein?
  • zuerst return $this->morphOne('App/Fotos/Foto', 'druckbaren');
  • Ah ja, das habe ich getan, sorry kopieren und einfügen die ganze Sache wieder schien sich nicht lohnt, aber das macht keinen Unterschied. Es ist die morphTo() das ist das problem, nicht das morphOne()
InformationsquelleAutor John Mellor | 2015-01-09
Schreibe einen Kommentar