【问题标题】:Laravel check if relation is emptyLaravel 检查关系是否为空
【发布时间】:2018-12-25 05:22:57
【问题描述】:

我有一个有一些关系的对象,我需要检查这些关系是否为空,我正在尝试检查 is_null、isset、!= undefined 等但没有任何效果,这是我得到的关系它是空的:

object(Illuminate\Database\Eloquent\Collection)#197 (1) {
  ["items":protected]=>
    array(0) {
  }
}

有没有办法轻松检查? 谢谢。

【问题讨论】:

  • $model->relation()->exists()

标签: laravel relationship


【解决方案1】:
Model::has('relation')->get();
Model::doesntHave('relation')->get();

【讨论】:

    【解决方案2】:

    首先,您可能需要检查您的Relation 是否已加载

    if ($user->relationLoaded('posts'))...
    

    其次,加载的时候,你可能想看看是空的Collection还是Null,

    if ($user->posts()->exists())...
    

    PS

    use Illuminate\Database\Eloquent\Relations\Relation;
    use Illuminate\Database\Eloquent\Collection;
    

    【讨论】:

      【解决方案3】:

      有多种方法可以做到这一点。

      在查询本身中,您可以过滤没有任何相关项目的模型:

      Model::has('relation')->get()
      

      一旦你有了一个模型,如果你已经加载了集合,你可以检查集合的计数:

      $model->relation->count();
      

      如果您想在不加载关系的情况下进行检查,可以对关系运行查询:

      $model->relation()->exists()
      

      注意:在上述示例中将relation 替换为您的关系名称。

      【讨论】:

      • Relation 是你在这里面的关系名称,不是字面的关系方法。
      【解决方案4】:

      这并不能直接回答问题,但您可以使用 Laravel 的 optional 帮助器来调用您怀疑可能没有值的关系的方法:

      optional($user->comments)->where('is_popular', true);
      

      如果用户没有 cmets,这将返回 null。否则会返回用户的热门 cmets。

      【讨论】:

      • 我认为它会返回一个空集合,而不是 Null
      【解决方案5】:

      如果模型已经加载了关系,可以判断变量为null或者调用isEmpty()查看相关项:

      // For one relation:
      if ( $model->relation ) {
          // ...
      } else {
          // $model->relation is null
      }
      
      // For many relations:
      if ( $model->relation->isEmpty() ) {
          // ...
      }
      

      【讨论】:

      • $model->relation->isEmpty() 是这个问题的定义答案。
      • 这是正确答案,$model->relation()->exists() 运行另一个查询,即使是急切加载的结果。
      • 如果一个关系已经deleted_at填充,值将是null,所以exists()和isEmpty()不起作用。
      【解决方案6】:
          $model->relation()->exists()
      if (count($model->relation))
      {
        // check exists
      }
      

      还有 第二种方法

      if(!is_null($model->relation)) {
         ....
      }
      

      【讨论】:

      • 我已经用我的关系(is_null($experiment->tm()))尝试了第二种方法,但这也不起作用:/第一个没有返回任何东西:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2013-12-23
      • 2020-02-04
      • 2017-09-14
      • 1970-01-01
      • 2014-08-24
      相关资源
      最近更新 更多