为什么我查询的ID和返回的ID不匹配?

时间:2014-10-15 15:52:46

标签: php laravel eloquent has-and-belongs-to-many

我正在为我的公司开发应用程序,而且我一直在使用Laravel。我需要在我的用户模型上自引用BelongsToMany关系,以允许用户属于其他用户。 (即AE - 客户)

这是我的代码:

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

Sentry::getUser()->clients()->find($id)的结果导致问题,因为当我使用关系时,它使用错误的ID搜索相关表。

我可以使用Sentry::getUser()->clients->find($id)并返回指定了ID的用户,但我无法将任何关系加载到该模型(我很清楚)。

ID Queried and ID Returned Don't Match

BelongsToMany关系(例如Sentry::getUser()->clients())是否通过数据透视表上的主键而不是命名键(client_id)查询结果集,如果是,我该如何绕过它?

2 个答案:

答案 0 :(得分:1)

正如您所看到的,此Sentry::getUser()->clients()->find($id)的结果非常正确。我的意思是它提取正确的用户,但它select *所以id(以及可能的其他常见字段)被覆盖,所以结果有

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

而其他字段是正确的。

所以你可以像这样查询关系:

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

或延迟加载关系(如果你真的需要这个)并使用Collection find()方法:

$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);

答案 1 :(得分:0)

你可以尝试这个,但我不知道它是否适合你,如果这是你想要实现的目标:

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

}))->get()->toArray();