Модели Laravel с несколькими связями действуют не так, как ожидалось
Вопрос
У меня есть User
модель и Organization
модели, которые я пытаюсь соотнести друг с другом.
Тот Самый users
таблица имеет id
и current_organization_id
поля (с внешним ключом) (среди других обычных полей).
Тот Самый organizations
таблица имеет id
и owner_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');
}
}
Идея заключается в том, что пользователь владеет одной организацией, но в организации много пользователей, и у каждого пользователя есть "текущая" организация, которую он может выбрать из любой организации, к которой принадлежит.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь сделать $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
После долгих отладок и поисков я наткнулся на этот пост что привело меня к реальной проблеме - подчеркиванию в имени функции.
По ссылке:
В документах Eloquent упоминается "имейте в виду, что методы должны соответствовать верблюжьему регистру, даже если столбцы вашей базы данных имеют змеиный регистр". Поэтому я считаю, что имя функции должно быть "objectMinor()".Eloquent фактически преобразует имена столбцов в регистре snake в регистр camel для имен методов .Это немного сбивает с толку, но делает это в соответствии с соглашениями об именовании PHP.
Итак, используя ответ @Cryode и вышеизложенное, я пришел к:
public function currentOrganization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}
Который может быть вызван через:
$organization = $user->current_organization;
Я думаю, они действительно должны сделать это более очевидным.
Другие советы
Вы захотите использовать belongsTo
отношения к нынешней организации.
public function current_organization()
{
return $this->belongsTo('Organization', 'current_organization_id');
}