Question

J'ai un User modèle et d'un Organization le modèle dont je suis en essayant de les relier l'un à l'autre.

L' users table a id et current_organization_id (clé étrangère) champs (parmi les autres champs).

L' organizations table a id et owner_id (clé étrangère) champs (avec quelques autres champs de données).

Il y a aussi un tableau croisé dynamique, organization_user qui relie les deux par l'intermédiaire de leurs respectifs id.

Mes modèles sont mis en place comme ceci:

Utilisateur:

<?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');
  }
}

L'idée est que d'une seule organisation est détenue par un utilisateur, mais une organisation a de nombreux utilisateurs, et chaque utilisateur dispose d'un "courant" de l'organisation, qu'ils peuvent sélectionner n'importe quelle organisation à laquelle ils appartiennent.

Le problème, je suis en cours d'exécution en est que lorsque j'essaie de faire $user->current_organization->id Je reçois un Trying to get property of non-object d'erreur, et si j'essaie $user->current_organization()->id; Je reçois un Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id erreur.

Toutes les idées sur ce que je fais mal que je ne peux pas récupérer la current_organization comme je suis en train de faire ci-dessus?

EDIT:

Je pense qu'il a à faire avec mes hasOne relation, mais j'ai essayé de faire ceci:

public function current_organization()
{
  return $this->hasOne('Organization', 'id', 'current_organization_id');
}

et toujours rien. $user->current_organization; est de retour NULL.

Était-ce utile?

La solution 2

Après beaucoup de débogage et de la recherche, je suis tombé sur ce post ce qui m'a conduit au vrai problème: le trait de soulignement dans le nom de la fonction.

À partir du lien:

L'Éloquent docs mention "garder à l'esprit que les méthodes devraient suivre chameau-boîtier, même si votre base de données, les colonnes sont de serpent-cas." J'Ai Donc croyez-le nom de la fonction doit être "objectMinor()".Éloquent convertit le serpent-cas des noms de colonne à dos de chameau cas pour le les noms de méthode.C'est un peu déroutant, mais il n'est pour se conformer à la PHP conventions de nommage.

Donc, à l'aide de @Cryode réponse, et la-dessus, je suis venu avec:

public function currentOrganization()
{
  return $this->belongsTo('Organization', 'current_organization_id');
}

Ce qui peut être appelé via:

$organization = $user->current_organization;

Je pense qu'ils devraient vraiment faire de ce plus évident.

Autres conseils

Vous aurez envie d'utiliser un belongsTo relation de l'entreprise actuelle.

public function current_organization()
{
    return $this->belongsTo('Organization', 'current_organization_id');
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top