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.

¿Fue útil?

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');
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top