Vypsání počtu řádkú výsledku pro všechny prvky foreach

erehulka
Člen | 5
+
0
-

Dobrý deň,

na mojej stránke potrebujem zobraziť počet turnusov pre každý zájazd. Zájazdy mám v jednej tabuľke databázy, turnusy v inej. Môžem ich vyhľadávať pomocou názvu destinácie, alebo prvku destinacie_id v tabuľke turnusy (a teda related(‚turnusy‘) atď.) Vyzerá to asi nejak takto:

"":https://drive.google.com/…xC3b3gr/view?…

To 1 je tam iba ako placeholder. Moja otázka teda je, že ako viem pre každý prvok {foreach} nájsť všetky turnusy v inej tabuľke databázy? Skúšal som niečo takéto:

{foreach $dests as $dest}
...
	<span style="font-size:24px;"> <strong>{include 'turnusy.latte' id => $dest->id} </strong></span>turnusov
...
{/foreach}

ibaže keď som aj spravil renderTurnusy v presenteri a turnusy.latte, kam som posunul $destId a snažil sa hľadať v databáze, tak mi to nešlo. Vedeli by ste mi prosím pomôcť? Ďakujem.

Polki
Člen | 553
+
-2
-

První nápad (možná né dobrý) je použít ORM, nebo při použití Nette Database si udělat i tak entitu.

například:

zajezd.php:

<?php

namespace App\Model;

use Nette;
use Nette\Utils\ArrayHash;
use Nette\Database\Table\ActiveRow;
use Nette\Database\Context;

/**
 * @property-read int $id
 * @property string $imgPath
 * @property string $name
 * @property string $description
 * @property float $price
 * @property-read int $pocetTurnusu
 */
final class zajezd {

    use Nette\SmartObject;

    /** @var Nette\Database\Context */
    private $db;

    /** @var ArrayHash */
    private $data;

    public function __construct(ActiveRow $data, Context $db) {
        $this->data = ArrayHash::from($data->toArray());
        $this->db = $db;
    }

    public function getId() {
        return $this->data->id;
    }

    public function getImgPath() {
        return $this->data->imgPath;
    }

    public function getName() {
        return $this->data->name;
    }

    public function getDescription() {
        return $this->data->description;
    }

    public function getPrice() {
        return $this->data->price;
    }

    public function getPocetTurnusu() {
        $this->db->table('turnusy')
                ->where('zajezd.id', $this->data->id)
                ->count();
    }

    public function setImgPath($value) {
        $this->data->imgPath = $value;
    }

    public function setName($value) {
        $this->data->name = $value;
    }

    public function setDescription($value) {
        $this->data->description = $value;
    }

    public function setPrice($value) {
        $this->data->price = $value;
    }

    public function save() {
        $this->db->table('zajezdy')
                ->where('id', $this->data->id)
                ->update($this->data);
    }
}

zajezdManager.php:

...
	public function getZajezd($id) {
    	return new zajezd($this->db->table('zajezdy')->get($id), $this->db);
	}

	public function addZajezd($data) {
		return new zajezd($this->db->table('zajezdy')->insert($data), $this->db);
	}

	public function getZajezdy() {
		$vysledek = [];

		$zajezdy = $this->db->table('zajezdy');
		foreach ($zajezdy as $zajezd) {
			$vysledek[] = new zajezd($zajezd, $this->db);
		}

    	return $vysledek;
	}
...

šablona:

{foreach $zajezdy as $zajezd}
...
    <span style="font-size:24px;"> <strong>{$zajezd->pocetTurnusu} </strong></span>turnusov
...
{/foreach}
Polki
Člen | 553
+
-1
-

Samozřejmě lze soubor zajezdy.php zkrátit a to třeba takto:

<?php

namespace App\Model;

use Nette;
use Nette\Utils\ArrayHash;
use Nette\Database\Table\ActiveRow;
use Nette\Database\Context;

final class zajezd {

    use Nette\SmartObject;

    /** @var Nette\Database\Context */
    private $db;

    /** @var ArrayHash */
    private $data;

    public function __construct(ActiveRow $data, Context $db) {
        $this->data = ArrayHash::from($data->toArray());
        $this->db = $db;
    }

    public function __get($name) {

        if ($name === 'pocetTurnusu') {
            return $this->db->table('turnusy')
                ->where('zajezd.id', $this->data->id)
                ->count();
        }

        return $this->data->$name;
    }

    public function __set($name, $value) {

        if ($name === 'pocetTurnusu') {
            throw new ReadOnlyException();
        } else if ($name === 'id') {
            throw new TryToEditIdException();
        }

        $this->data->$name = $value;
    }

    public function save() {
        $this->db->table('zajezdy')
                ->where('id', $this->data->id)
                ->update($this->data);
    }
}
F.Vesely
Člen | 368
+
+3
-

$dest->related('turnusy')->count(*) nefunguje?

Jinak {include 'turnusy.latte' id => $dest->id} akorat vlozi na to dane misto obsah turnusy.latte, nevola se u toho znova render metoda.

Editoval F.Vesely (8. 5. 2019 20:35)

erehulka
Člen | 5
+
0
-

Related nefunguje, lebo prepisujem starú stránku kde nie je InnoDB a keď sa to snažím zmeniť a pridať do tabuľky turnusy prvok destinacie_id s foreign key v tabuľke destinacie, tak mi to vypíše error:

Cannot add or update a child row: a foreign key constraint fails (cw010002db.<result 2 when explaining filename '#sql-6ccc_56c3b6'>, CONSTRAINT `#sql-6ccc_56c3b6_ibfk_1 FOREIGN KEY (destinacie_id) REFERENCES destinacie (ID))`

Teda na InnoDB som to zmenil, ale nejde mi pridať ten foreign key.

Tie predošlé možnosti vyskúšam, ďakujem!