我使用关系的条件/约束创建了一个模型Game,如下所示:
class Game extends Eloquent {
// many more stuff here
// relation without any constraints ...works fine
public function videos() {
return $this->hasMany('Video');
}
// results in a "problem", se examples below
public function available_videos() {
return $this->hasMany('Video')->where('available','=', 1);
}
}
字符串
当你这样使用它时:
$game = Game::with('available_videos')->find(1);
$game->available_videos->count();
型
一切正常,因为roles是结果集合。
我的问题:
当我试图访问它没有急于加载
$game = Game::find(1);
$game->available_videos->count();
型
一个异常被抛出,因为它说“Call to a member function count()on a non-object"。
使用
$game = Game::find(1);
$game->load('available_videos');
$game->available_videos->count();
型
工作正常,但对我来说似乎很复杂,因为如果我不使用关系中的条件,我不需要加载相关模型。
我错过了什么吗?我如何确保,available_videos可以访问而不使用急切加载?
对于任何感兴趣的人,我也在http://forums.laravel.io/viewtopic.php?id=10470上发布了这个问题
9条答案
按热度按时间p4tfgftt1#
我认为这是正确的方法:
字符串
然后你就得
型
vbkedwbf2#
//使用getQuery()添加条件
字符串
//简单地
型
niwlg2el3#
我想这就是你要找的东西(Laravel 4,参见http://laravel.com/docs/efeologent#querying-relations)
字符串
v2g6jxz64#
如果你想在关系表上应用条件,你也可以使用其他的解决方案。
字符串
swvgeqrz5#
以防其他人遇到同样的问题。
注意,关系必须是camelcase。所以在我的例子中,available_videos()应该是availableVideos()。
你可以很容易地找到调查Laravel源代码:
字符串
这也解释了为什么我的代码工作,每当我使用load()方法加载数据之前。
无论如何,我的例子现在运行得很好,$model->availableVideos总是返回一个Collection。
92dk7w1h6#
字符串
v440hwme7#
我已经通过将关联数组作为
Builder::with
方法的第一个参数传递来修复了类似的问题。假设您想通过一些动态参数包含子关系,但不想过滤父结果。
Model.php
字符串
然后,在其他地方,当你的逻辑被放置时,你可以做一些像通过
HasMany
类过滤关系的事情。例如(非常类似于我的情况):型
然后您将过滤所有子结果,但父模型不会过滤。谢谢关注。
4uqofj5v8#
Model(App\Post.php):
字符串
Controller(App\Http\Controller\PostController.php):
型
刀片模板(posts.blade.php):
型
igetnqfo9#
要使用where条件访问
hasMany
关系,可以使用whereHas
方法。下面是一个例子:
字符串
在本例中,Order是与物料具有hasMany关系的模型。whereHas方法用于根据物料关系的条件筛选订单。本例中的条件是merchant_referral_percentage列不应为null。
您可以修改where回调函数中的条件以满足您的特定需要。