вариант 1: 1 для отношений m: m Eloquent в Laravel 5.5: допустим ли пример?

#php #laravel #model #relationship

#php #laravel #Модель #отношения

Вопрос:

Я пытаюсь указать отношения 1: 1 через orgperson (), несмотря на m: m природу существующих отношений, orgs (), чтобы я мог с нетерпением загрузить 1 организацию по умолчанию.

У меня есть следующие объекты, каждый с таблицей:

  • модель person — важное примечание, defaultOrgID существует для person
  • запись организации
  • сводная система, соединяющая оба (orgperson) с дополнительными полями

Допустима ли моя «подтасовка», как показано в функции orgperson()?

Если нет, есть ли что-нибудь близкое, что было бы?

В модели Person соответствующие отношения следующие:

     // many-to-many relationship from person to orgs via org-person table
    public function orgs()
    {
        return $this->belongsToMany(Org::class, 'org-person', 'personID', 'orgID');
    }

    // "pivot table" with additional fields
    public function orgperson()
    {
        return $this->belongsTo(OrgPerson::class, 'personID', 'personID')
            ->where([
                ['orgID', $this->defaultOrgID],
                ['personID', $this->personID]
            ]);
    }
  

Комментарии:

1. почему бы не использовать withPivot вместо объявления нового отношения?

2. Как я понимаю с помощью Pivot, и в моей попытке попробовать это, я все еще получаю коллекцию отношений, потому что она построена на m: m через функцию belongsToMany eloquent. Я пытаюсь получить «отношение» 1: 1 для конкретной записи orgperson, о которой идет речь. Я готов признать, что моя цель, как задумано, может быть невозможной, но надеялся, что несколько других людей посмотрят и прокомментируют такую возможность.

Ответ №1:

Поскольку вы уже определили свои организации отношений, лучшим подходом было бы:

 public function orgperson()
    {
        return $this->orgs()
            ->where("orgID", '=', $this->defaultOrgID)
            ->where("personID", '=', $this->personID);       

    }
  

Комментарии:

1. Можно ли это объединить в запрос и быстро загрузить? Я знаю, что могу получить нужные данные, используя что-то вроде этого, но в других областях приложения я хочу получать объекты событий, в которых зарегистрированы «лица». И я хочу иметь возможность загружать все биты данных сразу. Я собираюсь попробовать это сейчас, чтобы узнать, как ответить на мой собственный вопрос в этом комментарии.

2. После исправления aove — изменения неоднозначного OrgID на org-person.OrgID — вышеуказанное не достигает того, что я надеюсь получить — загруженные данные отношений для правильного значения «orgperson». На выходе отображается нулевое отношение orgperson. Он остается нулевым даже после выполнения person-> load (‘orgperson’), который показывал данные в других версиях.

3. Оказывается, это не могло сработать, потому что оно берет информацию из организаций, а не из OrgPerson (которая является промежуточной (или сводной) таблицей, для которой у меня также есть модель.

Ответ №2:

Оказывается, это было так просто, как я надеялся.

Моя промежуточная таблица (org-person) была определена как модель. Я поиграл с расширением класса Pivot вместо Model, но, в конце концов, я остановился на Model.

Код, который работает (отношения в моей модели Person):

 public function orgperson()
{
    return $this->hasOne(OrgPerson::class, 'personID', 'personID')
        ->where('orgID', $this->defaultOrgID);
}
  

Это дает мне желаемый результат, заключающийся в том, что это отношение может возвращать одну запись из того, что может быть несколькими записями в сводной таблице, на основе значения в defaultOrgID .

Моя проблема заключалась в использовании «belongsTo» вместо «hasOne».