[laravel] Query Builder get method werkt niet
Ik ben een vrij grote query aan het maken met de query builder van laravel. Maar ik krijg helaas niks terug van de query, terwijl als ik deze in phpmyadmin uitvoer krijg ik wel waardes terug. Ik ben vast heel dom bezig, maar ik ben er nu al een tijdje mee aan het prutsen en ik hoopte dat iemand het hier ziet.
Code (php)
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
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
<?php
/*
|--------------------------------------------------------------------------
| fetch {objsoorten, state}
| @return objecten
|--------------------------------------------------------------------------
*/
public static function fetch($objsoorten, $state = 'active') {
$query = DB::table('objecten')
->select('objecten.obj_idx', 'objectsoorten.objsoort_id', 'objectsoorten.objsoort_naam', 'objectspecificaties.objspec_waarde', 'objecten.obj_actief', 'attributen.attr_naam', 'attributen.attr_regex')
->join('objectsoorten', 'objectsoorten.objsoort_id', '=', 'objecten.objsoort_id')
->join('objectsoort_attributen', 'objectsoort_attributen.objsoort_id', '=', 'objectsoorten.objsoort_id')
->join('attributen', 'attributen.attr_id', '=', 'objectsoort_attributen.attr_id')
->join('objectspecificaties', function($join) {
$join->on('objectspecificaties.attr_id', '=', 'attributen.attr_id')
->on('objectspecificaties.obj_id', '=', 'objecten.obj_id');
})
->whereIn('objecten.obj_id', function($query) use ($objsoorten, $state) {
$query->select('objecten.obj_id')
->from('objecten')
->join('objectsoorten', 'objectsoorten.objsoort_id', '=', 'objecten.objsoort_id')
->join('objectspecificaties', 'objectspecificaties.obj_id', '=', 'objecten.obj_id')
->where('objectspecificaties.objspec_waarde', 'LIKE', '\'%%\'');
if(is_array($objsoorten)) {
foreach($objsoorten as $key => $id) {
if($key == 0) {
$query->where('objecten.objsoort_id', '=', intval($id));
} else {
$query->orWhere('objecten.objsoort_id', '=', intval($id));
}
}
} else {
$query->where('objecten.objsoort_id', '=', $objsoorten);
}
if($state == 'all') {
$query->where('objecten.obj_actief', '=', 0);
$query->orWhere('objecten.obj_actief', '=', 1);
} elseif($state == 'active') {
$query->where('objecten.obj_actief', '=', 1);
} elseif($state == 'inactive') {
$query->where('objecten.obj_actief', '=', 0);
}
$query->groupBy('objecten.obj_id');
})
->groupBy('objectsoort_attributen.attr_id')
->groupBy('objecten.obj_id')
->orderBy('objectsoort_attributen.objsoort_id')
->orderBy('objecten.obj_id')
->orderBy('attributen.attr_id')
->get();
var_dump($query);
return ($query) ? $query : false;
}
?>
/*
|--------------------------------------------------------------------------
| fetch {objsoorten, state}
| @return objecten
|--------------------------------------------------------------------------
*/
public static function fetch($objsoorten, $state = 'active') {
$query = DB::table('objecten')
->select('objecten.obj_idx', 'objectsoorten.objsoort_id', 'objectsoorten.objsoort_naam', 'objectspecificaties.objspec_waarde', 'objecten.obj_actief', 'attributen.attr_naam', 'attributen.attr_regex')
->join('objectsoorten', 'objectsoorten.objsoort_id', '=', 'objecten.objsoort_id')
->join('objectsoort_attributen', 'objectsoort_attributen.objsoort_id', '=', 'objectsoorten.objsoort_id')
->join('attributen', 'attributen.attr_id', '=', 'objectsoort_attributen.attr_id')
->join('objectspecificaties', function($join) {
$join->on('objectspecificaties.attr_id', '=', 'attributen.attr_id')
->on('objectspecificaties.obj_id', '=', 'objecten.obj_id');
})
->whereIn('objecten.obj_id', function($query) use ($objsoorten, $state) {
$query->select('objecten.obj_id')
->from('objecten')
->join('objectsoorten', 'objectsoorten.objsoort_id', '=', 'objecten.objsoort_id')
->join('objectspecificaties', 'objectspecificaties.obj_id', '=', 'objecten.obj_id')
->where('objectspecificaties.objspec_waarde', 'LIKE', '\'%%\'');
if(is_array($objsoorten)) {
foreach($objsoorten as $key => $id) {
if($key == 0) {
$query->where('objecten.objsoort_id', '=', intval($id));
} else {
$query->orWhere('objecten.objsoort_id', '=', intval($id));
}
}
} else {
$query->where('objecten.objsoort_id', '=', $objsoorten);
}
if($state == 'all') {
$query->where('objecten.obj_actief', '=', 0);
$query->orWhere('objecten.obj_actief', '=', 1);
} elseif($state == 'active') {
$query->where('objecten.obj_actief', '=', 1);
} elseif($state == 'inactive') {
$query->where('objecten.obj_actief', '=', 0);
}
$query->groupBy('objecten.obj_id');
})
->groupBy('objectsoort_attributen.attr_id')
->groupBy('objecten.obj_id')
->orderBy('objectsoort_attributen.objsoort_id')
->orderBy('objecten.obj_id')
->orderBy('attributen.attr_id')
->get();
var_dump($query);
return ($query) ? $query : false;
}
?>
De var dump:
De resultset van phpmyadmin:
Alvast bedankt voor de gene die me kan helpen.
Gewijzigd op 31/07/2014 12:19:11 door Erwin H
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select `objecten`.`obj_id`, `objectsoorten`.`objsoort_id`, `objectsoorten`.`objsoort_naam`, `objectspecificaties`.`objspec_waarde`, `objecten`.`obj_actief`, `attributen`.`attr_naam`, `attributen`.`attr_regex`
from `objecten`
inner join `objectsoorten` on `objectsoorten`.`objsoort_id` = `objecten`.`objsoort_id`
inner join `objectsoort_attributen` on `objectsoort_attributen`.`objsoort_id` = `objectsoorten`.`objsoort_id`
inner join `attributen` on `attributen`.`attr_id` = `objectsoort_attributen`.`attr_id`
inner join `objectspecificaties` on `objectspecificaties`.`attr_id` = `attributen`.`attr_id`
and `objectspecificaties`.`obj_id` = `objecten`.`obj_id`
where `objecten`.`obj_id` in (select `objecten`.`obj_id`
from `objecten`
inner join `objectsoorten` on `objectsoorten`.`objsoort_id` = `objecten`.`objsoort_id`
inner join `objectspecificaties` on `objectspecificaties`.`obj_id` = `objecten`.`obj_id`
where `objectspecificaties`.`objspec_waarde` LIKE '%%'
and `objecten`.`objsoort_id` = 2
and `objecten`.`obj_actief` = 1
group by `objecten`.`obj_id`)
group by `objectsoort_attributen`.`attr_id`, `objecten`.`obj_id`
order by `objectsoort_attributen`.`objsoort_id` asc,
`objecten`.`obj_id` asc,
`attributen`.`attr_id` asc
from `objecten`
inner join `objectsoorten` on `objectsoorten`.`objsoort_id` = `objecten`.`objsoort_id`
inner join `objectsoort_attributen` on `objectsoort_attributen`.`objsoort_id` = `objectsoorten`.`objsoort_id`
inner join `attributen` on `attributen`.`attr_id` = `objectsoort_attributen`.`attr_id`
inner join `objectspecificaties` on `objectspecificaties`.`attr_id` = `attributen`.`attr_id`
and `objectspecificaties`.`obj_id` = `objecten`.`obj_id`
where `objecten`.`obj_id` in (select `objecten`.`obj_id`
from `objecten`
inner join `objectsoorten` on `objectsoorten`.`objsoort_id` = `objecten`.`objsoort_id`
inner join `objectspecificaties` on `objectspecificaties`.`obj_id` = `objecten`.`obj_id`
where `objectspecificaties`.`objspec_waarde` LIKE '%%'
and `objecten`.`objsoort_id` = 2
and `objecten`.`obj_actief` = 1
group by `objecten`.`obj_id`)
group by `objectsoort_attributen`.`attr_id`, `objecten`.`obj_id`
order by `objectsoort_attributen`.`objsoort_id` asc,
`objecten`.`obj_id` asc,
`attributen`.`attr_id` asc
Dit is dus het probleem, er gaat niks fout. De query zoals hij hem output is prima. Alleen ik krijg geen resultset terug van de query builder.
dus je hebt nu 44 regels code om een query van 19 regels te produceren. Ik begrijp die query builders niet....
Heb je deze query precies zo uitgevoerd in phpmyadmin?
Wat doet de foutafhandeling in php/laraval? Krijg je op de een of andere manier ergens meldingen?
Waarom heb je dit erin staan:
Deze voorwaarde kan je weglaten, aangezien het geen enkele restrictie oplevert.
2) Op dit moment is het alleen of er wat in staat ja/nee ivm met testen
3) Snap ik, dat is wederom voor het testen. Daar komt later een waarde in te staan waar op gezocht kan worden, heb ik er extra uitgelaten.
Weet je zeker dat je een db connectie hebt en dat je de juiste database hebt geselecteerd?
Alles werkt, alleen die query niet. Dit is niet de eerste query die ik uitvoer hoor
Dan wordt het stap voor stap die query opbouwen en elke keer testen of de resultaten nog komen.
Maar ik zeg net dat er met de query niks mis is, alleen ik krijg geen resultset van de query builder. De query zelf en het result ervan is goed als ik de query in sql invoer.
Probeer is bij "Order By", erbij te schrijven of het gaat om ASC of DESC?
Voer je de query wel uit?
Error reporting aangezet? Alsnog de query minimaliseren in PHP, misschien doet de query builder wel iets fout.
@Wouter: Ja de query builder deed idd wat fout, ik ben er eindelijk achter:
Deze regel was de boosdoener, dit omdat de query builder er geen value in zag maakte hij er automatisch een ? van, en aangezien er geen ? voorkomt in een van deze rows kreeg ik dus een lege resultset terug. Ik heb deze er dus even uit gehaald. Had ik ook wel kunnen nagaan achteraf, in ieder geval bedankt voor de moeite iedereen!
Met andere woorden, de query die je poste was dus NIET de query die door de query builder werd opgebouwd, anders had je daar de fout al kunnen vinden. Handig, om niet te posten waar naar gevraagd wordt.....
Erwin H op 31/07/2014 14:17:47:
Met andere woorden, de query die je poste was dus NIET de query die door de query builder werd opgebouwd, anders had je daar de fout al kunnen vinden. Handig, om niet te posten waar naar gevraagd wordt.....
.. Ik kon niet zo snel vinden hoe je het omzette naar SQL. Ik werk ook niet vaak met zulke grote queries, dus heb hier ook geen reden toe gehad.
Quote:
Ik werk ook niet vaak met zulke grote queries, dus heb hier ook geen reden toe gehad.
Om een query te kunnen debuggen moet je altijd weten welke query er uitgevoerd wordt. Je had in dit geval dus wel een rede om deze query te weten.
En trouwens, het lijkt me sterk dat je er uberhaubt moeite voor hebt gedaan om te vinden hoe je het omzet tot SQL. Een simpele google zoektocht naar "laravel query builder dump query" gaf me als eerste resultaat: http://stackoverflow.com/a/18236656/1149495 Daar staat toch heel duidelijk het antwoord...
Afijn, je hebt denk ik nu wel door dat je jezelf alleen maar in de voet schiet als je de bocht afsnijdt.
Ik snap je Erwin, ik ging er gewoon dom vanuit en dat is fout, maar goed. Het is opgelost, dank jullie.
Ook heb je een where in subquery waarin tabellen in de from clause staan die ook al in de from clause van hoofdquery staan.
Die subquery kan je dus gewoon weglaten, en de where clause van de subquery in de hoofdquery zetten, geeft hetzelfde resultaat maar is veel efficiënter.
Of ik bekijk het verkeerd, dat kan natuurlijk ook.
Dit is namelijk wat jij doet in jouw query.