Laravel检查雄辩者的回报是单个收集还是项目收集

时间:2019-02-16 12:11:24

标签: php laravel eloquent

我想知道如何检查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

那么如何处理这种情况?

4 个答案:

答案 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

文档:https://secure.php.net/instanceof

答案 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(); 对象。因此您可以避免水合作用并将其视为单个用户数据。

我担心需要这种条件的系统逻辑和模式。如果可能的话,我建议以一种重构的方式,使您的函数始终知道它是集合还是实例。您可以在函数中使用类型提示以使其更清晰。