Php 如何在Laravel雄辩的Jensseger Mongodb中使用Get On Eager loaded属性
我正在用拉威尔和詹塞格斯·蒙戈德雄辩。当我尝试使用get([…])或distinct(“…”)时,它在结果中给出空值。如何使用get([eager\u-loaded\u-attribute\u here])只获取一个被eager-loaded的给定属性 例如:Php 如何在Laravel雄辩的Jensseger Mongodb中使用Get On Eager loaded属性,php,eloquent,eager-loading,jenssegers-mongodb,Php,Eloquent,Eager Loading,Jenssegers Mongodb,我正在用拉威尔和詹塞格斯·蒙戈德雄辩。当我尝试使用get([…])或distinct(“…”)时,它在结果中给出空值。如何使用get([eager\u-loaded\u-attribute\u here])只获取一个被eager-loaded的给定属性 例如: Message::with(['sender','receiver']) ->where('sender_id', '=', Auth::user()->_id) ->orWhere('receiver_
Message::with(['sender','receiver'])
->where('sender_id', '=', Auth::user()->_id)
->orWhere('receiver_id', '=', Auth::user()->_id)
->orderBy($request->orderBy, $request->orderByDirection)
->skip(intval($request->offset))
->take(intval($request->limit))
->get()
给出:
[
{
"_id": "5abc2ba193782d24996aefda",
"receiver_id": "5abc28bd93782d235238c162",
"text": "Hello!",
"sender_id": "5abc2b8b93782d24996aefd8",
"updated_at": "2018-03-28 23:56:17",
"created_at": "2018-03-28 23:56:17",
"sender": {
"_id": "5abc2b8b93782d24996aefd8",
"name": "Test 5",
"updated_at": "2018-03-29 00:05:48",
"created_at": "2018-03-28 23:55:55"
},
"receiver": {
"_id": "5abc28bd93782d235238c162",
"name": "Test 1",
"updated_at": "2018-04-20 13:26:00",
"created_at": "2018-03-28 23:43:57"
}
},
...
]
[
{
"_id": "5abc2ba193782d24996aefda",
"sender": null,
"receiver": null
},
...
]
[
{
"0": "5abc2b8b93782d24996aefd8",
"sender": null,
"receiver": null
}
]
但是使用get:
Message::with(['sender','receiver'])
->where('sender_id', '=', Auth::user()->_id)
->orWhere('receiver_id', '=', Auth::user()->_id)
->orderBy($request->orderBy, $request->orderByDirection)
->skip(intval($request->offset))
->take(intval($request->limit))
->get(['sender'])
给出:
[
{
"_id": "5abc2ba193782d24996aefda",
"receiver_id": "5abc28bd93782d235238c162",
"text": "Hello!",
"sender_id": "5abc2b8b93782d24996aefd8",
"updated_at": "2018-03-28 23:56:17",
"created_at": "2018-03-28 23:56:17",
"sender": {
"_id": "5abc2b8b93782d24996aefd8",
"name": "Test 5",
"updated_at": "2018-03-29 00:05:48",
"created_at": "2018-03-28 23:55:55"
},
"receiver": {
"_id": "5abc28bd93782d235238c162",
"name": "Test 1",
"updated_at": "2018-04-20 13:26:00",
"created_at": "2018-03-28 23:43:57"
}
},
...
]
[
{
"_id": "5abc2ba193782d24996aefda",
"sender": null,
"receiver": null
},
...
]
[
{
"0": "5abc2b8b93782d24996aefd8",
"sender": null,
"receiver": null
}
]
同样,在使用distinct时:
$correspondants=Message::with(['sender','receiver'])
->distinct('sender_id')
->where('sender_id', '=', Auth::user()->_id)
->orWhere('receiver_id', '=', Auth::user()->_id)
->orderBy($request->orderBy, $request->orderByDirection)
->skip(intval($request->offset))
->take(intval($request->limit))
->get()
->toArray();
给出:
[
{
"_id": "5abc2ba193782d24996aefda",
"receiver_id": "5abc28bd93782d235238c162",
"text": "Hello!",
"sender_id": "5abc2b8b93782d24996aefd8",
"updated_at": "2018-03-28 23:56:17",
"created_at": "2018-03-28 23:56:17",
"sender": {
"_id": "5abc2b8b93782d24996aefd8",
"name": "Test 5",
"updated_at": "2018-03-29 00:05:48",
"created_at": "2018-03-28 23:55:55"
},
"receiver": {
"_id": "5abc28bd93782d235238c162",
"name": "Test 1",
"updated_at": "2018-04-20 13:26:00",
"created_at": "2018-03-28 23:43:57"
}
},
...
]
[
{
"_id": "5abc2ba193782d24996aefda",
"sender": null,
"receiver": null
},
...
]
[
{
"0": "5abc2b8b93782d24996aefd8",
"sender": null,
"receiver": null
}
]
使用以下命令:
->get()->pluck('sender');
如果需要查询生成器:
$senderIds = Message::distinct('sender_id')
->where('sender_id', '=', Auth::user()->_id)
[...]
->pluck('sender_id');
$senders = Sender::whereKey($senderIds)
[...]
->get();
你想达到什么目的?@JonasStaudenmeir我想选择一个渴望加载的字段。我只需要返回发送者,所以理想情况下我希望从其父对象“取消嵌套”发送者,并且只返回发送者数组。。。理想情况下,我还希望能够对发送者执行进一步的查询,就像SQLSelect(投影)一样。但当我在一个急切加载的字段上使用select时,我只得到null。。。是否有其他方法可以获取返回querybuilder的(…),以便我可以继续链接进一步的查询?谢谢。如果你不需要
接收者,你应该只使用和('sender')
@JonasStaudenmeir是的,但这只是为了表明出于某种原因,其他急切加载的字段会受到影响。。。在这种情况下,我希望只得到sender字段,但由于某种原因,得到了两个带空值的急切加载字段…太好了,有没有办法让它返回querybuilder,这样我就可以继续链接查询(例如orderBy、take等)?我扩展了我的答案。非常感谢。。。这对大型收藏安全吗?它似乎正在获取所有发送者id,如果在第一个查询(SenderID)上执行take/limit,这将是安全的,但我认为如果存在大量SenderID(例如:10m),并且需要在第二个查询(对于$senders)中执行take/limit,而不是在第一个查询中执行第一个,这将是相当不安全的
表示您的take()
和skip()
调用等。我只想保持简短,并将重点放在相关部分。