Php Laravel-帮助加载辅助关系(我目前有364个SQL查询正在运行)
我正在建立一个网站的管理方面在拉雷维尔4,并试图使一切工作在雄辩。我正在尝试构建一个具有多个关系的对象。在我尝试加载第二个关系之前,这似乎很有效 以下是我对YourDetail模型的调用: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
$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
。我将用实际代码对此进行测试,如果我找到了一些东西,我会告诉您该数组用于添加紧急加载约束。如果您删除该数组,它应该是五,但我不确定它是否会有帮助……它可能会有帮助。此外,例如,加载作者。联系人将自动加载作者
关系,因此您可以将这些单选项取出。这可能是正在运行的其他查询的来源。感谢您的帮助。我已尝试简化此问题,因此现在只加载一个嵌套关系(属于