Laravel-Modelle mit mehreren Beziehungen verhalten sich nicht wie erwartet
Frage
Ich habe ein User
Modell und ein Organization
Modell, das ich miteinander in Beziehung setzen möchte.
Der users
Tisch hat id
Und current_organization_id
(Fremdschlüssel-)Felder (neben den anderen normalen Feldern).
Der organizations
Tisch hat id
Und owner_id
(Fremdschlüssel-)Felder (zusammen mit einigen anderen Datenfeldern).
Es gibt auch eine Pivot-Tabelle, organization_user
die die beiden über ihre jeweiligen verbindet id
.
Meine Modelle sind so aufgebaut:
Benutzer:
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends \Cartalyst\Sentry\Users\Eloquent\User implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password', 'remember_token');
/**
* Defining many to many relationship to organizations
*/
public function organizations()
{
return $this->belongsToMany('Organization');
}
/**
* Defining relationship to current selected organization
*/
public function current_organization()
{
return $this->hasOne('Organization');
}
}
Organisation:
<?php
class Organization extends \Eloquent {
// Add your validation rules here
public static $rules = [
// 'title' => 'required'
];
// Don't forget to fill this array
protected $fillable = [];
public function users()
{
return $this->hasMany('User');
}
public function owner()
{
return $this->belongsTo('User');
}
}
Die Idee ist, dass eine einzelne Organisation einem Benutzer gehört, eine Organisation jedoch viele Benutzer hat und jeder Benutzer eine „aktuelle“ Organisation hat, die er aus jeder Organisation auswählen kann, der er angehört.
Das Problem, auf das ich stoße, ist das, wenn ich es versuche $user->current_organization->id
Ich bekomme ein Trying to get property of non-object
Fehler, und wenn ich es versuche $user->current_organization()->id;
Ich bekomme ein Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id
Fehler.
Irgendwelche Ideen, was ich falsch mache, die ich nicht abrufen kann current_organization
wie ich es oben versuche?
BEARBEITEN:
Ich denke, es hat mit meinem zu tun hasOne
Beziehung, aber ich habe es versucht:
public function current_organization()
{
return $this->hasOne('Organization', 'id', 'current_organization_id');
}
und immer noch nichts. $user->current_organization;
kehrt zurück NULL
.
Lösung 2
Nach langem Debuggen und Suchen bin ich darauf gestoßen dieser Beitrag was mich zum eigentlichen Problem führte – dem Unterstrich im Funktionsnamen.
Aus dem Link:
In den beredten Dokumenten erwähnen "Beachten Sie, dass die Methoden der Kamel-Casing folgen sollten, obwohl Ihre Datenbankspalten Schlangenfall sind." Ich glaube also, dass der Funktionsname "ObjectMinor ()" sein sollte.Eloquent konvertiert tatsächlich die Spaltennamen der Schlangengeschäfte in Kamelfall für die Methodennamen.Dies ist ein bisschen verwirrend, aber es entspricht dem PHP -Namenskonventionen.
Unter Verwendung der @Cryode-Antwort und der obigen Ausführungen kam ich auf Folgendes:
public function currentOrganization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
Kann aufgerufen werden über:
$organization = $user->current_organization;
Ich denke, sie sollten das wirklich deutlicher machen.
Andere Tipps
Sie möchten a verwenden belongsTo
Beziehung für die aktuelle Organisation.
public function current_organization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}