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.

Foi útil?

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');
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top