Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-帮助加载辅助关系(我目前有364个SQL查询正在运行)_Php_Sql_Laravel_Laravel 4_Eloquent - Fatal编程技术网

Php Laravel-帮助加载辅助关系(我目前有364个SQL查询正在运行)

Php Laravel-帮助加载辅助关系(我目前有364个SQL查询正在运行),php,sql,laravel,laravel-4,eloquent,Php,Sql,Laravel,Laravel 4,Eloquent,我正在建立一个网站的管理方面在拉雷维尔4,并试图使一切工作在雄辩。我正在尝试构建一个具有多个关系的对象。在我尝试加载第二个关系之前,这似乎很有效 以下是我对YourDetail模型的调用: $applicants = YourDetail::with(array('User', 'Application', 'SecondaryEds', 'SecondaryEds.SecondaryTypes', 'SecondaryEds.SecondaryGrades', 'FurtherEds', 'F

我正在建立一个网站的管理方面在拉雷维尔4,并试图使一切工作在雄辩。我正在尝试构建一个具有多个关系的对象。在我尝试加载第二个关系之前,这似乎很有效

以下是我对YourDetail模型的调用:

$applicants = YourDetail::with(array('User', 'Application', 'SecondaryEds', 'SecondaryEds.SecondaryTypes', 'SecondaryEds.SecondaryGrades', 'FurtherEds', 'FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades', 'UniEds', 'UniEds.UniClassifications', 'UniEds.UniQualifications', 'WorkExperiences', 'WhyYou', 'StartDate', 'Referer'))->whereIn('user_id', $applicants);
我的所有关系都在各种模型中定义,直接使用时效果良好。我遇到的问题是次要关系,例如

进阶。进阶类型,进阶。进阶等级, 大学。唯一分类,大学。唯一资格

等等

现在,当我刚刚运行查询时,我得到的正是我所期望的-大约20个代表各种模型的Select查询,所生成的Select查询引入了“dextured.dexturegrades”模型,例如如下所示:

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
// from the docs
You may even eager load nested relationships:

$books = Book::with('author.contacts')->get();
到目前为止还不错……

当我试图通过collection对象访问这些模型时,问题就出现了

假设我现在在集合中循环,将每个对象传递给如下视图:

foreach($applicants as $applicant){
    View::make('ApplicantView', compact('applicant'));
}
然后,在我的视图中,我尝试循环通过Futureds并呼应出FuturedGrades模型的一个属性:

applicationview.blade.php

这将为每个申请者创建一个新的sql查询,尽管我尝试了快速加载,例如

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` = ? limit 1 (for each applicant)
最终的结果是我的页面目前产生364个select查询,尽管页面加载速度还不错,但这似乎有点过分


有谁能解释一下我做错了什么,并给我指出正确的方向。

试着像这样加载二级相关模型:

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
// from the docs
You may even eager load nested relationships:

$books = Book::with('author.contacts')->get();

尝试加载如下二级相关模型:

select * from `further_grades` where `further_grades`.`deleted_at` is null and `further_grades`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
// from the docs
You may even eager load nested relationships:

$books = Book::with('author.contacts')->get();

任何感兴趣的人

我现在已经解决了这个问题:

我所做的似乎是正确地加载关系,但不正确地访问它们。因此,例如,如果您希望像这样加载关系:

$applicants = YourDetail::with('FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades');
然后,您应该像这样访问元素:

@foreach($applicants as $applicant)
@foreach($applicant->FurtherEds as $fe)
  {{ $fe->FurtherTypes->name }}
@endforeach
@endforeach
我遇到的问题是使用错误的资本化访问较低的模型:

例如


Laravel足够聪明,能够识别模型中的关系,因此它知道要访问什么,但它不会将
$applicator->defecteds
识别为与急切加载的模型对象
$applicator->defecteds
相同,而是生成新的sql查询

当我在一个稍微复杂的页面上这样做了几次时,我已经有了2000多个sql查询。吸取的教训。。。再也不会了


p、 现在我已经学会了如何正确地使用它。雄辩是官方有史以来最好的事情,如果你有困难,绝对值得坚持。

任何感兴趣的人

我现在已经解决了这个问题:

我所做的似乎是正确地加载关系,但不正确地访问它们。因此,例如,如果您希望像这样加载关系:

$applicants = YourDetail::with('FurtherEds.FurtherTypes', 'FurtherEds.FurtherGrades');
然后,您应该像这样访问元素:

@foreach($applicants as $applicant)
@foreach($applicant->FurtherEds as $fe)
  {{ $fe->FurtherTypes->name }}
@endforeach
@endforeach
我遇到的问题是使用错误的资本化访问较低的模型:

例如


Laravel足够聪明,能够识别模型中的关系,因此它知道要访问什么,但它不会将
$applicator->defecteds
识别为与急切加载的模型对象
$applicator->defecteds
相同,而是生成新的sql查询

当我在一个稍微复杂的页面上这样做了几次时,我已经有了2000多个sql查询。吸取的教训。。。再也不会了


p、 现在我已经知道如何正确地使用它了。雄辩是有史以来官方认为最好的事情,如果你有困难,绝对值得坚持。

这不正是我正在做的吗?唯一的区别似乎是我有一系列的关系。如果我错了,请你详细说明我错在哪里。不过,我没有注意到你的数组中有这个:
deferreds.deferredgrades
。我将用实际代码对此进行测试,如果我有什么想法,我会告诉您该数组用于添加急切的负载约束。如果你拿走这个阵列应该是五点,虽然我不确定它会有帮助。。。可能吧。此外,例如,加载
author.contacts
也会自动加载
authors
关系,因此您可以将您拥有的单打号码取出。这可能是正在运行的其他查询的来源。感谢您的帮助。我已经尝试过简化这个问题,所以现在我只是加载一个嵌套关系(belongsTo和belongsTo),并在with()方法中将关系传递给它(如上所述-无数组),而且我仍然有多个select查询按id分别挑选次要关系。(这是在将它们全部挑选出来的查询之后出现的。似乎只要我尝试访问这些关系,它就会产生一个新的查询……非常感谢您的任何建议。您可能是对的……似乎只有当我尝试从(刀片)中循环通过对象时才会发生这种情况。)视图-如果我在模型或控制器中循环对象,它不会产生额外的查询。这不正是我正在做的吗?唯一的区别似乎是我有一个关系数组。如果我错了,请你详细说明我错在哪里。不过,我没有注意到你的数组中有这个:
defecteds.FurtherGrades
。我将用实际代码对此进行测试,如果我找到了一些东西,我会告诉您该数组用于添加紧急加载约束。如果您删除该数组,它应该是五,但我不确定它是否会有帮助……它可能会有帮助。此外,例如,加载
作者。联系人
将自动加载
作者
关系,因此您可以将这些单选项取出。这可能是正在运行的其他查询的来源。感谢您的帮助。我已尝试简化此问题,因此现在只加载一个嵌套关系(属于