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.

War es hilfreich?

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');
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top