Модели Laravel с несколькими связями действуют не так, как ожидалось

StackOverflow https://stackoverflow.com//questions/25025878

Вопрос

У меня есть 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');
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top