Laravel modèles avec de multiples relations n'agissant pas comme prévu
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
.
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');
}