2014-10-15 3 views
1

Я работаю над разработкой приложения для своей компании, и я использую Laravel. Мне нужна была привязка BelongsToMany к моей модели пользователя, чтобы пользователи могли принадлежать другим пользователям. (Т.е. ОПЗ - Клиенты)Почему не запрашивается ID и возвращенный идентификатор?

Вот мой код:

$id = 6; 
var_dump("ID Queried Is: $id.", Sentry::getUser()->clients()->find($id)->toArray()); 

Результат Sentry::getUser()->clients()->find($id) вызывает проблемы, потому что, когда я использую отношения, он использует неправильный идентификатор для поиска в соответствующей таблице.

Я могу использовать Sentry::getUser()->clients->find($id), и он возвращает пользователя с указанным идентификатором, но я не могу загрузить какие-либо отношения к этой модели (что я знаю).

ID Queried and ID Returned Don't Match

отношение BelongsToMany (например Sentry::getUser()->clients()) запрос результирующего набора первичного ключ на сводной таблице, а не по имени ключ (client_id), и если да, то как я могу получить ли вокруг него?

+0

Вы пытаетесь найти клиента с id 6 или клиентами для пользователя с идентификатором 6? –

+0

Я ищу, чтобы найти Клиента, у которого есть ID # 6, но только если у предполагаемого пользователя есть клиент №6 у своих клиентов. (первый) – Goldentoa11

+0

На данный момент я использую 'Sentry :: getUser() -> clients() -> с (" folders ") -> где (" client_id "," = ", $ id) -> first() 'как обходной путь, но это так тяжело. – Goldentoa11

ответ

1

В результате этого Sentry::getUser()->clients()->find($id), как вы можете видеть, довольно очень правильно. Я имею в виду, выбирающий правильный пользователь, однако select * так id (и, возможно, другие общие поля) является переопределен, поэтому результат имеет

$client->id; // id of the pivot table 

в то время как другие поля правильно.

Таким образом, вы можете запросить отношение так:

$client = Sentry::getUser()->clients()->select('users.*')->find($id); 

или ленивые нагрузки соотношение (если вам действительно это нужно) и использовать Collectionfind() метод:

$user = Sentry::getUser()->load('clients'); 
$client = $user->clients->find($id); 

// or one line, not recommended: 
$client = Sentry::getUser()->load('clients')->clients->find($id); 

В противном случае просто использовать то, что Вы пытались:

$client = Sentry::getUser()->clients->find($id); 
+0

Благодарим вас за объяснение * why * id использует идентификатор строки сводной таблицы, а не идентификатор строки таблицы пользователя. С другой стороны, Laravel Eager загружает свои отношения по умолчанию? Я думал, что они были ленивы загружены (например, не загружены до тех пор, пока не понадобятся) по умолчанию, но вы, например, примеры, заставляете меня задаться вопросом, является это или нет. – Goldentoa11

+0

Нет, он не хочет ничего загружать, если вы не скажете об этом. Что заставило вас думать, что это так? –

+0

'$ user = Sentry :: getUser() -> load ('clients');' и затем prefacing, что с 'или lazy load отношение (если вам это действительно нужно)'. Это заставило меня задаться вопросом, по умолчанию ли Laravel Eager загружается. – Goldentoa11

0

Вы можете попробовать с этим, но я не знаю, если он будет работать для вас, и если это то, что вы хотите достичь:

$users = Sentry::getUser()->with(array('clients' => function($q) use($id) 
{ 
    $q->whereId($id); 

}))->get()->toArray(); 
Смежные вопросы