Laravel modelos com múltiplos relacionamentos não funcionam como esperado
Pergunta
Eu tenho um User
modelo e Organization
o modelo que estou a tentar se relacionar com o outro.
O users
tabela id
e current_organization_id
(chave estrangeira) campos (entre outros campos normais).
O organizations
tabela id
e owner_id
(chave estrangeira) campos (junto com alguns outros campos de dados).
Há também uma tabela dinâmica, organization_user
que liga as duas através de seus respectivos id
.
Meus modelos são definidos como este:
Usuário:
<?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');
}
}
Organização:
<?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');
}
}
A ideia é que uma única organização é de propriedade de um usuário, mas uma organização tiver muitos usuários, e cada usuário tem uma "corrente" da organização, o que eles podem selecionar a partir de qualquer organização a que pertencem.
O problema que eu tenho é que quando eu tento fazer $user->current_organization->id
Eu recebo um Trying to get property of non-object
erro, e se eu tentar $user->current_organization()->id;
Eu recebo um Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id
erro.
Alguma idéia sobre o que eu estou fazendo de errado que eu não posso recuperar o current_organization
como eu estou tentando fazer acima?
EDITAR:
Eu estou pensando que tem a ver com a minha hasOne
relacionamento, mas eu tentei fazer isso:
public function current_organization()
{
return $this->hasOne('Organization', 'id', 'current_organization_id');
}
e nada ainda. $user->current_organization;
está de regresso NULL
.
Solução 2
Depois de muita depuração e pesquisa, me deparei com este post o que me levou para o problema real -- o carácter de sublinhado no nome da função.
A partir do link:
O Eloqüente docs menção "tenha em mente que os métodos que deve seguir camelo-revestimento, mesmo que seu banco de dados as colunas são de cobra caso." Então Eu acredito que o nome da função deve ser "objectMinor()".Eloquente realmente converte a cobra-caso os nomes de coluna camelo-caso o os nomes de método.Isto é um pouco confuso, mas fá-lo conformar-se a PHP convenções de nomenclatura.
Assim, usando @Cryode resposta e acima, eu vim com:
public function currentOrganization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
O que pode ser chamado através de:
$organization = $user->current_organization;
Eu acho que eles deveriam realmente fazer isso mais óbvio.
Outras dicas
Você vai querer usar um belongsTo
relação para a organização atual.
public function current_organization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}