Nette\Database – chybný průchod / počty

- knedle
 - Člen | 34
 
Zdravím,
narazil jsem jednu nesrovnalost, nevím zda je to chyba fw nebo má:
3 normální tabulky: song, interpret a spojovací interpret_song
- tab interpret_song má PRIMARY „interpret_id, song_id“
 - v nich 1 song, navázaný na 2 interprety
 
vyhledávám řetězec v obou obsahových tabulkách tímto způsobem:
<?php
$this->interpretSongs->where('interpret.name LIKE ? OR song.title LIKE ? ', $keyword, $keyword);
?>
už při dotazu na počet vrácených výsledků se mi vrací různé počty:
<?php
$interpretSongs->count('interpret_song.created_at') // 2 - spravny pocet , shodny s poctem vracenych radku z db
$interpretSongs->count() // 1 - spatny pocet , ??
?>
a když provedu (klasický) průchod:
<tr n:foreach="$interpretSongs as $interpretSong">
    <td>{$interpretSong->interpret->name}</td>
    <td>{$interpretSong->song->title}</td>
</tr>
vypíše se mi jen jeden řádek, ačkoli by měly být dva.
důvod?
je to chyba, není to chyba? je to moje chyba?

- knedle
 - Člen | 34
 
- verze nette – poslední stable:
 
Nette Framework (version 2.0.1 released on 2012–02–29)
- první sql generuje správné:
 
SELECT `interpret_song`.`song_id`, `interpret_song`.`interpret_id`, `interpret_song`.`year`,
`interpret_song`.`created_at`, `interpret_song`.`modified_at`
FROM `interpret_song`
INNER JOIN `interpret` ON `interpret_song`.`interpret_id` = `interpret`.`id`
INNER JOIN `song` ON `interpret_song`.`song_id` = `song`.`id`
WHERE (`interpret`.`name` LIKE "%rachel%" OR `song`.`title` LIKE "%rachel%" )
ORDER BY `created_at` DESC
LIMIT 25
OFFSET 0
tohle sql vrátí – správně – 2 řádky
problém vznikne při průchodu v latte – viz výše – kdy místo vyspání 2 řádků:
| interpret A | Ráchel | 
| interpret B | Ráchel | 
vypíše jen první z nich
(tech interpretů tam může být klidně 100, vypíše jen toho prvního)
db
DROP TABLE IF EXISTS `interpret`;
CREATE TABLE `interpret` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `created_at` datetime NOT NULL,
  `modified_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
DROP TABLE IF EXISTS `song`;
CREATE TABLE `song` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `created_at` datetime NOT NULL,
  `modified_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
DROP TABLE IF EXISTS `interpret_song`;
CREATE TABLE `interpret_song` (
  `interpret_id` int(11) NOT NULL,
  `song_id` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `modified_at` datetime NOT NULL,
  `counter` int(11) NOT NULL DEFAULT '1',
  `year` smallint(6) NOT NULL,
  PRIMARY KEY (`interpret_id`,`song_id`),
  KEY `song_id` (`song_id`),
  CONSTRAINT `interpret_song_ibfk_1` FOREIGN KEY (`interpret_id`) REFERENCES `interpret` (`id`),
  CONSTRAINT `interpret_song_ibfk_2` FOREIGN KEY (`song_id`) REFERENCES `song` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
-- 2012-03-19 22:15:46
a ještě testovací data:
TRUNCATE `interpret`;
INSERT INTO `interpret` (`id`, `name`, `created_at`, `modified_at`) VALUES
(1,	'Interpret A',	'0000-00-00 00:00:00',	'0000-00-00 00:00:00'),
(2,	'Interpret B',	'0000-00-00 00:00:00',	'0000-00-00 00:00:00');
TRUNCATE `song`;
INSERT INTO `song` (`id`, `title`, `created_at`, `modified_at`) VALUES
(1,	'Ráchel',	'0000-00-00 00:00:00',	'0000-00-00 00:00:00'),
(2,	'Song ABC',	'0000-00-00 00:00:00',	'0000-00-00 00:00:00');
TRUNCATE `interpret_song`;
INSERT INTO `interpret_song` (`interpret_id`, `song_id`, `created_at`, `modified_at`, `counter`, `year`) VALUES
(1,	1,	'0000-00-00 00:00:00',	'0000-00-00 00:00:00',	1,	0),
(2,	1,	'0000-00-00 00:00:00',	'0000-00-00 00:00:00',	1,	0),
(2,	2,	'0000-00-00 00:00:00',	'0000-00-00 00:00:00',	1,	0);
					Editoval knedle (20. 3. 2012 7:39)

- hrach
 - Člen | 1844
 
Neprojevuje se ti to náhodou jen když máš zapnutou cache?
Řekl bych, že už je to opravený bug, který čeka na merge.
https://github.com/…tte/pull/574

- knedle
 - Člen | 34
 
Neprojevuje se ti to náhodou jen když máš zapnutou cache?
no / ja nejak tu cache nedokazu vypnout:
https://forum.nette.org/…rror-warning#…
takze nemuzu porovat vypnuti/zapnuti
Editoval knedle (20. 3. 2012 23:35)

- knedle
 - Člen | 34
 
takze night build hlásí:
No reference found for $interpret_song->
a error ukáže zde (na druhem řádku):
$row = $this->interpretSongs->where('interpret_id', $interpretId)->where('song_id', $songId)->fetch();
$row->update(array('counter' => new \Nette\Database\SqlLiteral('`counter` + 1'), 'modified_at' => new \Nette\Database\SqlLiteral('NOW()')));
					Editoval knedle (21. 3. 2012 0:51)