2016-05-02 4 views
1

Проблемаконструктор запросов на hasMany отношения

Я создаю API с Laravel. Каждый сервер может иметь более одного контакта, и каждый контакт принадлежит одному серверу - как таковые, контакты настроены с отношением belongsTo, а серверы имеют отношение hasMany к контактам.

Пользователь может иметь много серверов через свои отношения hasMany. Таким образом, при создании сервера мы просто вызываем $user->server()->create([values]), который работает отлично.

Вопрос заключается в том, что когда мы пытаемся вызвать его дальше, как и с контактами - мы попали в стену, где мы получаем:

Call to undefined method Illuminate\Database\Query\Builder::contacts()

При использовании: $user->server()->contacts()->create([]).

Метод есть в модели сервера. У нас также есть отношение hasManyThrough на пользовательской модели, указав, что у пользователя много контактов через серверы.

При вызове $user->contact()->create([]), вместо этого мы получаем:

Call to undefined method Illuminate\Database\Query\Builder::create()

Кто-нибудь есть ключ, что может быть причиной этого? Не могут ли построители запросов не допускать такого типа цепочки, или я не вижу чего-то явно очевидного? Как вы можете видеть, я пробовал несколько разных методов, но, похоже, не мог создать рабочий результат.

Cheers!

+0

Я уверен, что вы не можете создать через 'hasManyThrough'. Пример, который Laravel дает для этих отношений «пост» и «страна» через «пользователь». Почта может принадлежать Стране, если ее Пользователь является частью этой страны. По этой логике вы пытаетесь создать страну из должности. Кажется неправдой. – Josh

+0

@ Jaw.sh Это имеет смысл - но почему это не будет работать через HasMany? – CmdrSharp

+1

Не знаю. API Laravel 5.2 говорит, что отношение 'HasMany' имеет функцию' create() '. Что-то еще не так. https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Relations/HasMany.html#method_create – Josh

ответ

0

Как вы сказали:

Пользователь может иметь несколько серверов через его hasMany отношения.

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

Так что вы можете сделать, это itterate над:

foreach ($user->server as $server) { 
    $server->contacts()->create($values); 
} 

Вы видите: теперь у вас есть конкретный сервер с идентификатором, чтобы поместить в записи нового контакта.

+0

Вы, конечно, правы! Я пошел по пути: '$ srv = $ user-> server() -> find ($ server_id)', а затем создал контакт через '$ srv-> contacts() -> create ([])', который немедленно сработал , Ура! – CmdrSharp

Смежные вопросы