Issue:
I am using eloquent to pull students from a database where they have specific status and registration date values. They must also only be shown if sub-table data as specific column data as well.
The issue is that Laravel is breaking it up into multiple queries and the "with" (eager loading) tables are only getting filtered after the fact.
In other words, instead of (pseudo sql):
SELECT all students WHERE
status IN (1,4,6,7)
AND (YEAR(registration_date)<=2020 OR YEAR(registration_date) IS NULL)
AND YEAR(commencement_date)>=2020
AND (YEAR(completion_date)>=2020 OR YEAR(estimated_completion_date)>=2020)
Its pushing out 4 separate sql statements (refer to 'resulting SQL' below) where its only applying the status / registration_date filter on students, and separately the other filters down the line which causes the actual row results to be incorrect (displaying more than they should).
I would just use DB::table / DB:raw - but then on the blade end of things, I cant pull sub-child data because its no longer in a hierarchal structure.
Code:
DB::enableQueryLog();
$students = $bursary_administrator->students()->whereIn('status',[1,4,6,7])
->whereHas('bursaries', function($query) use ($request) {
$query->whereYear('registration_date','<=',$request->year)
->orWhereNull('registration_date');
})
->with(['bursaries','bursaries.enrolments','bursaries.enrolments.courses' => function($query) use ($request) {
$query->whereYear('commencement_date', '<=', $request->year)
->where(function ($query) use ($request){
$query->whereYear('completion_date', '>=', $request->year)
->whereYear('estimated_completion_date', '>=', $request->year,'or');
});
}])
->orderBy('student_name')->orderBy('student_middle_names')->orderBy('student_surname')->get();
Log::debug(DB::getQueryLog());
Resulting SQL:
local.DEBUG: array (
0 =>
array (
'query' => 'select `students`.*, `bursary_administrator_student`.`bursary_administrator_id` as `pivot_bursary_administrator_id`, `bursary_administrator_student`.`student_id` as `pivot_student_id`, `bursary_administrator_student`.`created_at` as `pivot_created_at`, `bursary_administrator_student`.`updated_at` as `pivot_updated_at` from `students` inner join `bursary_administrator_student` on `students`.`id` = `bursary_administrator_student`.`student_id` where `bursary_administrator_student`.`bursary_administrator_id` = ? and `status` in (?, ?, ?, ?) and exists (select * from `student_bursaries` where `students`.`id` = `student_bursaries`.`student_id` and (year(`registration_date`) <= ? or `registration_date` is null)) order by `student_name` asc, `student_middle_names` asc, `student_surname` asc',
'bindings' =>
array (
0 => 1,
1 => 1,
2 => 4,
3 => 6,
4 => 7,
5 => '2020',
),
'time' => 6.69,
),
1 =>
array (
'query' => 'select * from `student_bursaries` where `student_bursaries`.`student_id` in (1, 3, 14, 20, 24, 25, 29, 41, 42, 44, 49, 51, 53, 55, 56, 62, 64, 65, 72, 75, 76, 80, 81, 85, 94, 98, 100, 106, 111, 112, 133, 138, 139, 141, 156, 157, 169, 170, 180, 199, 203, 210, 213, 214, 217, 219, 221, 224, 225, 226, 227, 228, 229, 231, 232, 233, 234, 235, 237, 238, 239, 240, 242, 243, 246, 249, 251, 252, 253, 254, 255, 256, 257, 258, 260, 261, 262, 263, 265, 267, 268, 269, 270, 271, 273, 274, 275, 276, 277, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 297, 299, 300, 302, 303, 304, 305, 306, 307, 308, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 333, 334, 335, 336, 337, 338, 339, 340, 341, 343, 344, 345, 346, 347, 348, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364)',
'bindings' =>
array (
),
'time' => 2.41,
),
2 =>
array (
'query' => 'select * from `student_bursary_enrolments` where `student_bursary_enrolments`.`student_bursary_id` in (1, 3, 14, 20, 24, 25, 29, 41, 42, 44, 49, 51, 53, 55, 56, 62, 64, 65, 72, 75, 76, 80, 81, 85, 94, 98, 100, 106, 111, 112, 133, 138, 139, 141, 156, 157, 169, 170, 180, 199, 203, 210, 213, 214, 217, 219, 221, 224, 225, 226, 227, 228, 229, 231, 232, 233, 234, 235, 237, 238, 239, 240, 242, 243, 246, 249, 251, 252, 253, 254, 255, 256, 257, 258, 260, 261, 262, 263, 265, 267, 268, 269, 270, 271, 273, 274, 275, 276, 277, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 297, 299, 300, 302, 303, 304, 305, 306, 307, 308, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 333, 334, 335, 336, 337, 338, 339, 340, 341, 343, 344, 345, 346, 347, 348, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364)',
'bindings' =>
array (
),
'time' => 2.41,
),
3 =>
array (
'query' => 'select * from `student_bursary_enrolment_courses` where `student_bursary_enrolment_courses`.`student_bursary_enrolment_id` in (1, 3, 12, 18, 19, 21, 22, 27, 28, 38, 39, 40, 41, 42, 43, 48, 50, 52, 53, 55, 56, 57, 64, 65, 66, 67, 72, 75, 76, 77, 81, 82, 85, 93, 96, 98, 99, 104, 110, 111, 130, 134, 135, 136, 138, 152, 153, 154, 164, 165, 175, 180, 181, 187, 193, 194, 195, 196, 200, 201, 202, 203, 204, 205, 206, 209, 210, 211, 212, 213, 214, 215, 216, 219, 220, 221, 222, 223, 224, 225, 226, 227, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 247, 248, 252, 253, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 280, 283, 284, 285, 286, 287, 288, 289, 290, 292, 293, 294, 295, 296, 297, 298, 299, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 371, 372, 373, 374, 375, 376, 377, 378, 379, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 409, 411, 413, 414, 415, 417, 418, 419, 424, 429, 431, 432, 433, 436, 442, 443, 445, 447, 448, 450, 452, 453, 456, 457, 466, 467, 468, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485) and year(`commencement_date`) <= ? and (year(`completion_date`) >= ? or year(`estimated_completion_date`) >= ?)',
'bindings' =>
array (
0 => '2020',
1 => '2020',
2 => '2020',
),
'time' => 2.85,
),
)
Blade / View:
<tbody>
#if ($students)
#php($row_count=0)
#foreach ($students as $student)
#php($row_count++)
<tr>
<td>{{$row_count}}</td>
<td>{{$student->student_name .' '. $student->student_middle_names .' '. $student->student_surname}}</td>
<td colspan="4">
#if ($student->bursaries)
<table class="subtable">
#foreach ($student->bursaries as $bursary)
#if ($bursary->enrolments)
#foreach ($bursary->enrolments as $enrolment)
#if ($enrolment->courses)
#foreach ($enrolment->courses as $course)
<tr>
<td>{{$enrolment->academic_institution->academic_institution .' - '. $course->course}}</td>
<td class="f114">{{__($course->current_year)}}</td>
</tr>
#endforeach
#else
<tr><td>Error: No courses</td></tr>
#endif
#endforeach
#else
<tr><td>Error: No enrolments</td></tr>
#endif
#endforeach
</table>
#else
Error: No bursaries
#endif
</td>
</tr>
#endforeach
#endif
</tbody>
This is the migration code but it gives this error
( Class 'Modules\RolePermission\Entities\InfixPermissionAssign' not found )
I have checked the names everything is right and the path is also correct appreciate your help.
I have copied this code from another project it was working there. Everything is same here too but still it doesn't work here.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Modules\RolePermission\Entities\InfixModuleInfo;
use Modules\RolePermission\Entities\InfixModuleStudentParentInfo;
use Modules\RolePermission\Entities\InfixPermissionAssign;
class CreateInfixPermissionAssignsTable extends Migration
{
/**
* Run the migrations.
*
* #return void
*/
public function up()
{
Schema::create('infix_permission_assigns', function (Blueprint $table) {
$table->increments('id');
$table->tinyInteger('active_status')->default(1);
$table->timestamps();
$table->integer('module_id')->nullable()->comment(' module id, module link id, module link options id');
$table->string('module_info')->nullable();
$table->integer('role_id')->nullable()->unsigned();
$table->foreign('role_id')->references('id')->on('infix_roles')->onDelete('cascade');
$table->text('saas_schools')->nullable();
$table->integer('created_by')->nullable()->default(1)->unsigned();
$table->integer('updated_by')->nullable()->default(1)->unsigned();
$table->integer('school_id')->nullable()->default(1)->unsigned();
$table->foreign('school_id')->references('id')->on('sm_schools')->onDelete('cascade');
});
// for admin
$admins = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 533, 534, 535, 536, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 214, 215, 216, 217, 218, 219, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 537, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 538, 539, 540, 485, 486, 487, 488, 489, 490, 491, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570];
foreach ($admins as $key => $value) {
$permission = new Modules\RolePermission\Entities\InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 5;
$permission->save();
}
// for teacher
$teachers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 533, 534, 535, 536, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 214, 215, 216, 217, 218, 219, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 537, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 277, 278, 279, 280, 281, 282, 283, 284, 285, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567];
foreach ($teachers as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 4;
$permission->save();
}
// for receiptionists
$receiptionists = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 65, 66, 67, 83, 84, 85, 86, 160, 161, 162, 163, 164, 188, 193, 194, 195, 376, 377, 378, 379, 380, 553, 554, 560, 564];
foreach ($receiptionists as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 7;
$permission->save();
}
// for librarians
$librarians = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 61, 64, 65, 66, 67, 83, 84, 85, 86, 160, 161, 162, 163, 164, 188, 193, 194, 195, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 376, 377, 378, 379, 380, 553, 554, 560, 564];
foreach ($librarians as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 8;
$permission->save();
}
// for drivers
$drivers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 188, 193, 194, 19, 553, 554, 560, 564];
foreach ($drivers as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 9;
$permission->save();
}
// for accountants
$accountants = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 65, 66, 67, 68, 69, 70, 83, 84, 85, 86, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 188, 193, 194, 195, 376, 377, 378, 379, 380, 381, 382, 383, 553, 554, 560, 564];
foreach ($accountants as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 6;
$permission->save();
}
// student
for ($j = 1; $j <= 55; $j++) {
$permission = new InfixPermissionAssign();
$permission->module_id = $j;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 2;
$permission->save();
}
$students = [554, 555, 559, 564];
foreach ($students as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 2;
$permission->save();
}
// parent
for ($j = 56; $j <= 96; $j++) {
$permission = new InfixPermissionAssign();
$permission->module_id = $j;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 3;
$permission->save();
}
$students = [554, 555, 560, 559, 564];
foreach ($students as $key => $value) {
$permission = new InfixPermissionAssign();
$permission->module_id = $value;
$permission->module_info = InfixModuleInfo::find($value)->name;
$permission->role_id = 3;
$permission->save();
}
}
/**
* Reverse the migrations.
*
* #return void
*/
public function down()
{
Schema::dropIfExists('infix_permission_assigns');
}
}
Have you checked the namespace and the permission of the file? Make sure the namespace and permission and owner of the file is correct. In my cases, sometimes both of those problem were the one when everything just 'seems' to be in order.