MyISAM, join a Selection – problém s referencí

Daewoo
Člen | 33
+
0
-

Ahoj.

Lze přepsat následující SQL dotaz do Nette Database aby se vracelo Selection? Už mi došly nápady…

SELECT p.* FROM product p JOIN product_searchdata ON product_searchdata.product = p.id WHERE MATCH (product.ean, product.description) AGAINST (?) ORDER BY 2 * MATCH(p.ean) AGAINST (?) + MATCH(p.description) DESC

Jsem nucen používat pro fulltext MyISAM, takže nemůžu udělat referenci a bez ní nejsem schopen poskládat dotaz dokupy. Představuju si něco takovýho:

$this->database->select('a.*')
			->from('product', 'a')
			->join('product_searchdata', 'b')
			->on('b.product = a.id')
		->where("MATCH ...
Daewoo
Člen | 33
+
+2
-

Přišel jsem na to. V tomto případě lze použít conventional reflexi se kterou se pracuje takto:

nette:
    database:
        reflection: conventional

Sloupec „product“ v „product_searchdata“ přejmenovat na „product_id“ (jak velí conventional pravidla) a promazat temp složku.

Daewoo
Člen | 33
+
0
-

Tak problém otevírám znovu. Některé části kódu pracují se standardní reflexí. Potřebuji pro jednu konkrétní funkci používat conventional reflexi – jde to nějak vynutit?

Daewoo
Člen | 33
+
0
-

Ze zoufalství:

  1. Upravit řádek v konstruktoru třídy N\D\T\Selection na:
$this->sqlBuilder = new SqlBuilder($tableName, $context, $conventions);
  1. Upravit definici kontruktoru třídy N\D\T\SqlBuilder na:
public function __construct($tableName, Context $context, IConventions $conventions = null)
  1. Upravit řádek v totožné funkci na:
$this->conventions = $conventions === null ? $context->getConventions() : $conventions;

Pak lze podle potřeby volat:

$selection = new \Nette\Database\Table\Selection($this->database, new \Nette\Database\Conventions\StaticConventions(), "eshop_product_searchdata");

Platí pro Nette 2.2, nevím jak jinde.

CZechBoY
Člen | 3608
+
0
-

Proč? Nastav to v konfiguraci databáze.
https://doc.nette.org/cs/configuring#…

Daewoo
Člen | 33
+
0
-

Zkoušel jsem, nemůžu – rozbiju tím zase kód jinde, který počítá s discovered.

CZechBoY
Člen | 3608
+
0
-

Na co ten discovered potřebuješ? Já jedu na static conventions a žádnej problém.

Pavel Kravčík
Člen | 1180
+
0
-

Dá se to i přepsat jak člověk potřebuje, my jsme to museli udělat kvůli prefixům. My například máme tabulky con_contract, ale vazby contract_id. Stačí si tam změnit ty sprintf.

class DatabaseReflection extends \Nette\Database\Conventions\StaticConventions
{
	public function getHasManyReference(){}
}
Daewoo
Člen | 33
+
0
-

CZechBoY napsal(a):

Na co ten discovered potřebuješ? Já jedu na static conventions a žádnej problém.

Rozjebalo se mi ukládání objednávky. Neměl jsem čas na přepisování (bůh ví, kde by to všude řvalo), upravuju po asi 10 lidech, co od toho utekli, už běžící projekt…

Pavel Kravčík napsal(a):

Dá se to i přepsat jak člověk potřebuje, my jsme to museli udělat kvůli prefixům. My například máme tabulky con_contract, ale vazby contract_id. Stačí si tam změnit ty sprintf.

class DatabaseReflection extends \Nette\Database\Conventions\StaticConventions
{
	public function getHasManyReference(){}
}

Taky řešení.

===

Díky chlapi za váš čas!