I modelli di Laravel con molteplici relazioni non agiscono come previsto
Domanda
Ho un modello User
e un modello Organization
che sto cercando di relazionarsi l'un l'altro.
La tabella users
ha i campi id
e current_organization_id
(tasto estraneo) (tra gli altri campi normali).
La tabella organizations
ha i campi id
e owner_id
(tasto estraneo) (insieme ad alcuni altri campi dati).
C'è anche un tavolo per pivot, organization_user
che collega i due tramite il loro rispettivo id
.
I miei modelli sono impostati come questo:
Utente:
<?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');
}
}
.
Organizzazione:
<?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'idea è che un'unica organizzazione è di proprietà di un utente, ma un'organizzazione ha molti utenti e ogni utente ha un'organizzazione "corrente", che possono selezionare da qualsiasi organizzazione a cui appartengono.
Il problema che sto entrando è che quando provo a fare $user->current_organization->id
ottengo un errore Trying to get property of non-object
, e se provo $user->current_organization()->id;
ottengo un errore Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id
.
Qualche idea su cosa sto facendo male che non riesco a recuperare il current_organization
come sto cercando di fare sopra?
Modifica:
Sto pensando che ha a che fare con la mia relazione hasOne
, ma ho provato a farlo:
public function current_organization()
{
return $this->hasOne('Organization', 'id', 'current_organization_id');
}
.
e ancora niente. $user->current_organization;
sta tornando NULL
.
Soluzione 2
Dopo tanto debug e ricerca, mi sono imbattuto in Questo post che mi ha portatoal vero problema - il sottolineatura nel nome della funzione.
Dal collegamento:
.I documenti eloquenti menzionano "Tieni presente che i metodi dovrebbero seguire Cammello-involucro, anche se le colonne del database sono casi di serpente. "Così io Credi che il nome della funzione dovrebbe essere "ObjectMinor ()".Eloquente in realtà converte i nomi delle colonne del custodia del serpente in custodia del cammello per il nomi dei metodi.Questo è un po 'confuso, ma lo fa per conformarsi Convenzioni di denominazione PHP.
Quindi, usando la risposta @cryode e quanto sopra, sono venuto con:
public function currentOrganization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
.
che può essere chiamato tramite:
$organization = $user->current_organization;
.
Penso che dovrebbero davvero renderlo più ovvio.
Altri suggerimenti
Vuoi utilizzare una relazione belongsTo
per l'organizzazione corrente.
public function current_organization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
.