نماذج 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

بعد الكثير من التصحيح والبحث، جئت عبر هذا المشنور مما قادني إلى المشكلة الحقيقية - الشرطة السفلية في اسم الوظيفة.

من الرابط :

تشير المستندات البليغة إلى "ضع في اعتبارك أن الأساليب يجب أن تتبع الإبل ، على الرغم من أن أعمدة قاعدة البيانات الخاصة بك هي حالة ثعابين." لذلك أعتقد أن اسم الوظيفة يجب أن يكون "ObjectMinor ()".يقوم البليغ في الواقع بتحويل أسماء الأعمدة لحالة الأفعى إلى حالة الجمل لأسماء الأسلوب.هذا أمر مربك بعض الشيء ، لكنه يفعل ذلك لتتوافق مع اتفاقيات تسمية 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