Predanie parametra do basemodelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Reziw
Člen | 22
+
0
-

Ahojte,

napadol ma jeden nápad ale neviem či je možné ho realizovať. Kedže využívam MVP mám na každú jednu logickú časť stránky vlastný presenter a model. Mám napríklad model na Novinky lenže využívam v nej dve až viac tabuliek. Lenže v modeli na Uživateľov mám rovnaké dotazy na DB len v inej tabuľke. Premýšlal som že by som vytvoril jednu metodu napríklad getAll ktorá by mala ako parameter meno tabuľky. Ale to mi príde ako hlúpost a určite by sa našiel spôsob ako to spraviť lepšie … Máte niekto nejaky nápad ?

Martk
Člen | 661
+
0
-

Udělat abstraktní BaseModel a tam dát často používané metody?

Reziw
Člen | 22
+
0
-

Antik napsal(a):

Udělat abstraktní BaseModel a tam dát často používané metody?

Ale ako tej metode predať tabuľku ?

Reziw
Člen | 22
+
0
-

Cez parameter metody mi to príde hlúposť

Martk
Člen | 661
+
0
-

Nejlépe udělat abstraktní metodu getTableName, dá se použít i konstanta, ale je to druhá horší možnost.

Reziw
Člen | 22
+
0
-

abstraktní metodu getTableName ? Ako to myslíš ?

Martk
Člen | 661
+
0
-
abstract class BaseModel {

	protected $context;

	abstract protected function getTableName();

	public function getAll() {
		return $this->context->table($this->getTableName())->fetchAll();
	}

}

Model:

class News extends BaseModel {

	const TABLE_NAME = 'news';

	protected function getTableName() {
		return self::TABLE_NAME;
	}

}

Editoval Antik (29. 6. 2016 13:16)

Reziw
Člen | 22
+
0
-

Čo v prípade že je viac tabuliek … ?

Martk
Člen | 661
+
0
-

Rozdělit to na více modelů, model by měl být zodpovědný právě za jednu tabulku.

Reziw
Člen | 22
+
0
-

Práve si pozerám detailnejšie MVP a zaujímalo b ma či to platí aj pre presenter. Ide o to že v NewsPresenter riešim aj kategorie noviniek a teda som to preniesol aj do modelu na 2 tabuľk teda novinky a ich kategorie. Teraz si len nie som istý či pre tie kategorie vytvoriť aj zvlásť presenter alebo stačí Model aby to bolo správne

CZechBoY
Člen | 3608
+
0
-

@Reziw Lepší by bylo mít modul novinek a tam řešit přidávání, editaci, mazání novinek a pak kategorie aj.

Jde o SRP – jedna třída má za úkol dělat jen jednu věc

Editoval CZechBoY (29. 6. 2016 13:41)

newPOPE
Člen | 648
+
+2
-

Rozdělit to na více modelů, model by měl být zodpovědný právě za jednu tabulku.

toto je blbost. Model moze kludne operovat nad viacerymi tabulkami, uloziskami, …

@Reziw osobne by som siel cestou kde si predam/injektem storage (v tvojom pripade pripojenie k DB) do modelu a tam si ho pouzivam ako uznam za vhodne (1, 2, X tabuliek).

class MyModel {
  private $database;

  function __construct(\Nette\Database\Context $database) {
	$this->database = $database;
  }

  // tu uz si napisem veci ako presne potrebujem
}

EDIT:
Co sa tyka zdielania funkcionality (to su tie dotazy ktore sa ti opakuju) tak ano da sa ist cestou MyModel extends BaseModel alebo pouzit traity ktore mi tu pasuju z hladiska skladania funkcionality viac ako dedenie.

Editoval newPOPE (29. 6. 2016 13:46)

CZechBoY
Člen | 3608
+
0
-

@newPOPE Myslim, že @Antik to myslel spíš jako entitu a ne jako tabulku – tzn. můžu vracet v jednom repozitáři jednu entitu vyfiltrovanou klidně podle 50 dalších tabulek.
V případě zapisovacích operací je to trochu složitější a asi je lepší to řešit událostma.

Reziw
Člen | 22
+
0
-

@newPOPE Presne niečo také som skúšal ale neviem ako predať do metody názov tabuľky z iného modelu .. Teda jeden by som zvládol ale ked je ich viac už je problém

<?php

namespace App\Model;

use Nette\Database\Context;
use Nette\Object;

/**
 * Class BaseManager
 * @package App\Model
 * Hlavná modelova logika pre prácu s databázov
 */
class BaseManager extends Object
{
    /** @var Context */
    protected $database;

    /**
     * BaseManager constructor.
     * @param Context $database
     */
    public function __construct(Context $database)
    {
        $this->database = $database;
    }

    public function getAll(){
        $this->database->table(???);
    }
}

@CZechBoY Mohol by si mi o tých moduloch povedať viac ? Prípadne nejaky zaujímavy link kde sa venuju tejto problematike

Barvoj
Člen | 60
+
0
-

CZechBoY napsal(a):
V případě zapisovacích operací je to trochu složitější a asi je lepší to řešit událostma.

Jak to myslíš událostma? :) Jako že bych měl pro každou tabulku model a každý model by pak poslouchal třeba na několika formulářích a zpracovával by si vždy tu část formuláře, která ho zajímá?

newPOPE
Člen | 648
+
0
-

@Reziw taketo daco

trait BaseDbManager {
  public function getAll() {
	$this->database->table($this->getTableName());
  }
}

class MyModel {
  use BaseDbManager;

  protected function getTableName() {
    return "tableName";
  }
}
CZechBoY
Člen | 3608
+
0
-

@Barvoj Klidně bych to tak i udělal, ale musely by se pohlídat výjimky.
@Reziw
https://doc.nette.org/…n/presenters#…
https://doc.nette.org/…n/presenters#…
 http://blog.jsifalda.name/…instalator-3

Editoval CZechBoY (29. 6. 2016 14:37)