我想知道如何检查Eloquent Query的返回是来自数据库的单行还是多行。
我尝试了$record->count()
,但是在2种情况下,它总是返回大于1的值。
例如:
$record = User::first();
return $record->count(); //it return the count of columns in users table
,如果我想吸引所有用户;
$record = User::all();
return $record->count(); //it return the count of all rows in users table
那么如何处理这种情况?
答案 0 :(得分:1)
您可以使用instanceof
构造检查变量是什么样的数据。
对于您的示例,这可能是这样的:
$record = User::first();
$record instanceof \App\User; // returns true
$record instanceof \Illuminate\Database\Eloquent\Collection; // returns false
$record = User::all();
$record instanceof \App\User; // returns false
$record instanceof \Illuminate\Database\Eloquent\Collection; // returns true
答案 1 :(得分:0)
User::all()
返回一个User
的数组,因此简单的方法是检查是否为数组。
if (is_array($record)){
}
答案 2 :(得分:0)
您可以为此使用PHP函数count
$record = User::first();
return count($record);
答案 3 :(得分:0)
Post.findOneAndUpdate
但是,如果您使用的是数据库构建器,则上述不能直接起作用:
router.post(
"/comment/:id",
passport.authenticate("jwt", { session: false }),
(req, res) => {
// Check Validation
new Comment({
user: req.user._id,
text: req.body.text
})
.save()
.then(comment => {
Post.findOneAndUpdate(
{ _id: req.params.id },
{ $push: { comments: comment._id } },
{ new: true }
)
.then(post => { <---
console.log(post);
res.json(post);
})
.catch(err => {
console.log(err);
res.status(404).json({ postnotfound: "No post found" });
});
});
}
);
$record = ......;
if($record instanceof \Illuminate\Support\Collection){
// its a collection
}
elseif($record instanceof \App\User){
// its a single url instance
}
是一个数组。因此,您需要将其水合,以便可以在其上使用上述逻辑:
$record = DB::table('users')->get();
现在,您可以在$ record上使用if else逻辑,因为它从数组转换为内部从$record
扩展到的if(is_array($record){
$record = \App\User::hydrate($record);
}
还有,第二种情况是有人用\Illuminate\Database\Eloquent\Collection
代替了\Illuminate\Support\Collection
:
first()
然后get()
是$record = \DB::table('users')->first();
对象。因此您可以避免水合作用并将其视为单个用户数据。
我担心需要这种条件的系统逻辑和模式。如果可能的话,我建议以一种重构的方式,使您的函数始终知道它是集合还是实例。您可以在函数中使用类型提示以使其更清晰。