#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».