Laravel Eloquent hasMany \ hasOne将父母限制为有记录的孩子

时间:2015-09-26 03:38:16

标签: php laravel

使用Laravel Eloquent和hasOne()\ hasMany()关系,是否可以将“父”表限制为仅在存在“child \ foreign”关系时检索结果?

FOOS

+----+------------+
| id |     etc    |
+----+------------+
|  1 |     one    |
|  2 |     two    |
|  3 |     three  |
|  4 |     four   |
+----+------------+

BARS

+----+-----+--------+
| id | val | foo_id |
+----+-----+--------+
| 11 | 101 |      1 |
| 12 | 102 |      2 |
| 13 | 203 |      3 |
| 14 | 204 |      4 |
+----+-----+--------+

在Foo类(模型)

public function highBars(){
    return $this->hasOne('App\Bar')->where('val','>','200');
}
控制器中的

Foo::with('highBars')->get();

返回所有FOOS,即使某些high_bars关系为空。 是否可以仅包含关系值不为空的FOOS结果? (foos.id = 3,4)

这是检索到的......

  0 => array:3 [▼
    "id" => 1
    "etc" => "one"
    "high_bars" => null
  ]
  1 => array:3 [▼
    "id" => 2
    "etc" => "two"
    "high_bars" => null
  ]
  2 => array:3 [▼
    "id" => 3
    "etc" => "three"
    "high_bars" => array:2 [▼
      "id" => 13
      "val" =>203
      "foo_id" =>3
    ]
  ]
  3 => array:3 [▼
    "id" => 4
    "etc" => "four"
    "high_bars" => array:2 [▼
      "id" => 14
      "val" =>204
      "foo_id" =>4
    ]
  ]

但这就是我想要的......

0 => array:3 [▼
    "id" => 3
    "etc" => "three"
    "high_bars" => array:2 [▼
      "id" => 13
      "val" =>203
      "foo_id" =>3
    ]
  ]
  1 => array:3 [▼
    "id" => 4
    "etc" => "four"
    "high_bars" => array:2 [▼
      "id" => 14
      "val" =>204
      "foo_id" =>4
    ]
  ]

2 个答案:

答案 0 :(得分:3)

引用documentation

  

访问模型的记录时,您可能希望限制您的   结果基于存在关系。例如,想象一下   您想要检索至少有一条评论的所有博客帖子。至   这样做,您可以将关系的名称传递给has方法:

// Retrieve all posts that have at least one comment...
$posts = App\Post::has('comments')->get();
  

您还可以指定运算符并计算以进一步自定义   查询:

// Retrieve all posts that have three or more comments...
$posts = Post::has('comments', '>=', 3)->get();
  

也可以使用“点”表示法构造嵌套的语句。   例如,您可以检索至少有一条评论的所有帖子   并投票:

// Retrieve all posts that have at least one comment with votes...
$posts = Post::has('comments.votes')->get();
  

如果您需要更多电量,可以使用whereHas和orWhereHas   将“where”条件放在您的查询上的方法。这些方法   允许您向关系约束添加自定义约束,   例如检查评论的内容:

// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

答案

对于您的具体示例,这可以通过使用:

来实现
Foo::has('highBars')->get();

答案 1 :(得分:0)

这还不够。当您定义关系时,您只需告诉Laravel哪些数据与实体相关联,但它并不限制数据的获取方式。

所以当你在你的控制器中时

Foo::with('highBars')->get();

这里的关键是get。你不会把它限制在任何东西上,你只是说,把你所有的行都拿给我,除此之外,得到与这个模型相关的数据。你需要做的是添加一个约束。

Foo::with('highBars')->whereHas('highBars', function ($query) {
    $query->where('val', '>', '200');
})->get();

或者它的快捷方式是

Foo::has('highBars')->get();