Laravel modelos con múltiples relaciones que no actúa como se espera
Pregunta
Tengo un User
y un modelo Organization
el modelo que estoy tratando de relacionar el uno al otro.
El users
la tabla tiene id
y current_organization_id
(clave extranjera) campos (entre las otras normales campos).
El organizations
la tabla tiene id
y owner_id
(clave extranjera) campos (junto con algunos otros campos de datos).
También hay una tabla dinámica, organization_user
lo que une a los dos a través de sus respectivos id
.
Mis modelos como este:
Usuario:
<?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');
}
}
Organización:
<?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');
}
}
La idea es que una sola organización es propiedad de un usuario, pero una organización que tiene muchos usuarios y cada usuario tiene un "actual" de la organización, que se pueden seleccionar de cualquier organización a la que pertenecen.
El problema que me estoy quedando en es que cuando trato de hacer $user->current_organization->id
Puedo obtener un Trying to get property of non-object
error, y si lo intento $user->current_organization()->id;
Puedo obtener un Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id
error.
Alguna idea sobre lo que estoy haciendo mal que no me puedo recuperar el current_organization
como estoy tratando de hacerlo de arriba?
EDITAR:
Estoy pensando que hacer con mi hasOne
relación, pero traté de hacer esto:
public function current_organization()
{
return $this->hasOne('Organization', 'id', 'current_organization_id');
}
y todavía nada. $user->current_organization;
es el regreso NULL
.
Solución 2
Después de mucho depuración y buscando, me encontré con este post lo que me llevó a la real problema ... el guión bajo en el nombre de la función.
Desde el enlace:
El Elocuente docs mencionar que "tenga en cuenta que los métodos que se deben seguir camel, a pesar de que su base de datos de las columnas de la serpiente-caso". Así Que Me creen que el nombre de la función debe ser "objectMinor()".Elocuente en realidad convierte a la serpiente-el caso de los nombres de columna de camello-el caso de la los nombres de método.Esto es un poco confuso, pero lo hace para ajustarse a PHP convenciones de nomenclatura.
Así, el uso de @Cryode respuesta y la de arriba, se me ocurrió:
public function currentOrganization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
Que puede ser llamado a través de:
$organization = $user->current_organization;
Creo que realmente debería hacer esto más evidente.
Otros consejos
Querrás usar un belongsTo
relación para la organización actual.
public function current_organization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}