具有多种关系的Laravel模型未按预期运行

时间:2014-07-29 22:14:43

标签: php laravel laravel-4 eloquent

我有User模型和Organization模型,我试图将它们相互关联。

users表包含idcurrent_organization_id(外键)字段(在其他普通字段中)。

organizations表包含idowner_id(外键)字段(以及其他一些数据字段)。

还有一个数据透视表organization_user,它通过各自的id链接两者。

我的模型设置如下:

用户:

<?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');
  }

}

组织:

<?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');
  }
}

这个想法是一个组织由一个用户拥有,但一个组织有很多用户,每个用户都有一个&#34;当前&#34;组织,他们可以从他们所属的任何组织中选择。

我遇到的问题是当我尝试$user->current_organization->id时出现Trying to get property of non-object错误,如果我尝试$user->current_organization()->id;,我会得到Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$id错误。

关于我做错什么的任何想法,我无法检索current_organization,就像我试图做的那样?

编辑:

我认为这与我的hasOne关系有关,但我尝试过这样做:

public function current_organization()
{
  return $this->hasOne('Organization', 'id', 'current_organization_id');
}

仍然没有。 $user->current_organization;正在返回NULL

2 个答案:

答案 0 :(得分:2)

您需要为当前组织使用belongsTo关系。

public function current_organization()
{
    return $this->belongsTo('Organization', 'current_organization_id');
}

答案 1 :(得分:0)

经过大量的调试和搜索后,我遇到了this post这导致我遇到了真正的问题 - 函数名中的下划线。

从链接:

  

Eloquent docs提到“请记住,方法应该遵循   骆驼套管,即使你的数据库列是蛇形的。“所以我   相信函数名称应为“objectMinor()”。雄辩   实际上将蛇案例列名称转换为驼峰案例   方法名称。这有点令人困惑,但它符合要求   PHP命名约定。

所以,使用@Cryode的答案和上面的内容,我提出了:

public function currentOrganization()
{
  return $this->belongsTo('Organization', 'current_organization_id');
}

可以通过以下方式调用:

$organization = $user->current_organization;

我认为他们应该让这更加明显。