Laravel 如果未加载关系,则阻止DB查询

Laravel 如果未加载关系,则阻止DB查询,laravel,laravel-5,Laravel,Laravel 5,我有两个模型,例如,一对多关系的国家和城市 当我运行此代码时 $countries = Country::query()->with('cities')->get(); foreach ($countries as $country) { $cities = $country->cities; foreach ($cities as $city) { dump($city->country); } } ,在每个$city->c

我有两个模型,例如,一对多关系的国家和城市

当我运行此代码时

$countries = Country::query()->with('cities')->get();

foreach ($countries as $country) {
    $cities = $country->cities;

    foreach ($cities as $city) {
        dump($city->country);
    }
}
,在每个$city->country调用中,我都有一个对DB的查询

select * from `countries` where `countries`.`id` = ? limit 1 
如果在我的案例cities.country中的关系没有加载渴望加载,那么是否有可能阻止对每个$city->country调用进行DB查询


我不需要$country变量。如果未在主查询中加载关系cities.country,则需要获取null。

为什么不进行反向操作:

$cities = City::with('country')->get();

// this way you would loop only once:

foreach ($cities as $city) {
    dump($city->country);
}
使用您的方法,然后:

foreach ($countries as $country) {
    $cities = $country->cities;

    foreach ($cities as $city) {
        dump($country);
        // here the $country variable 
       // is the same as the $city->country one, so no need to query it again..
    }
}
多亏了

就我而言

//...
if ($city->relationLoaded('country')) {
    dump($city->country);
} else {
    dump(null);
}
//...


谢谢,但我不需要反向,我需要停止关系的嵌套。你想要树结构吗?你可以用我的编辑。。不需要调用$city->country,因为在该循环中,$country是您已经拥有的。。那么为什么还要再次查询它呢?我不需要$country变量。我需要停止嵌套关系,因此当调用dump$city->countyoverride模型中的城市并显式地将return null放入时,我需要null;因为您的用例根本没有意义:如果您需要返回null,只需将null放在那里就可以了。为什么要使用$city->country?您已经有了country对象,例如,@WouterVanDamme。在我的案例中,当我调用$city->country时,我需要得到null,这不是laravel的工作方式。如果您尝试调用未加载的关系,它将加载它。按照代码的布局方式,$city->country永远不会返回null。如果你直接查询城市并循环结果,可能会有,但你是在查询国家,然后循环,所以永远不会是这样。@Timlews谢谢,我不明白,为什么我的问题被否决了。这是我的情况,我需要在我的Mapper和HttpResource中做出决定。这个否决票是有偏见的。这是一个很好的检查,但请让我知道,根据您的用例,它是否会是真的。。我真的很怀疑。@nakov如果我想得到不是null而是$country的值,我必须用'cities.country'设置查询。因此,通过这个检查relationLoaded,我可以更好地控制对DB的查询,主要目标已经实现。我的观点是,$city->relationLoaded'country'将永远不会返回true,因为你从来不会像你在评论中提到的那样从城市加载国家。所以我认为支票上没有任何意义。但你更了解你的生意,所以继续,这场讨论没有任何结果:这比这个答案被否决更不公平。制作它的人不理解这个主题。这个人能在这里解释为什么被否决吗?