[TYPO3-UG Dutch] foreign_table_where met IN statement (tca.php)

Wiel, J.A.M. van de j.a.m.v.d.wiel at tue.nl
Wed Apr 29 19:03:11 CEST 2009


Hoi Barbara,
Wat de Kickstarter een database relation noemt, past inderdaad niet in een numeriek gegevenstype. Blob is daar dan bruikbaar voor, maar TEXT bijvoorbeeld ook. Welk type precies het efficientst is, durf ik zo ook niet te zeggen. Het probleem zit 'm in het feit dat MySQL de waarde uit het blob-veld niet als kommagescheiden lijst ziet. Staat er 1,2,3,4 in, dan ziet MySQL dat als de letterlijke waarde "1,2,3,4" en niet als een lijst losse getallen. Gebruik je daar vervolgens de IN-constructie op, dan matcht 'ie alleen als precies de gehele inhoud van het veld overeenkomt.

Het lijkt erop dat je een veel-op-veel-relatie aan het bouwen bent, en daar zijn relationele databases niet heel sterk in. Ik zie het volgende ongeveer voor me:

Tabel: tx_zwffietsen_soorten
----------------------------------
uid | INT
pid| INT
soort | varchar(64)

Tabel: tx_zwffietsen_fietsen
-----------------------------------
uid | INT
pid | INT
soort | INT <-- uid-waarde uit tx_zwffietsen_soorten
eigenaar | varchar(64)

Op deze manier kan een fiets altijd maar bij 1 soort horen, en een soort kan veel fietsen bevatten. De zgn. 1-op-veel-relatie met de soort als parent, en de fietsen als children. Wil je nu dat fietsen een onbeperkt aantal soorten kunnen hebben, dan heb je een tussentabelletje nodig, ongeveer als volgt:

Tabel: tx_zwffietsen_fietssoort
------------------------------------
uid | INT
pid | INT
fiets | INT <-- uid-waarde uit tabel tx_zwffietsen_fietsen
soort | INT <-- uid-waarde uit tabel tx_zwffietsen_soorten

Je zou nu bijvoorbeeld de eigenaars kunnen achterhalen van alle fietsen met soort=2, als volgt:

SELECT eigenaar FROM tx_zwffietsen_fietsen WHERE uid IN (SELECT fiets FROM tx_zwffietsen_fietssort WHERE soort=2);

Je kunt dit ook flexibeler doen door de fietsen met bijvoorbeeld soorten 3 en 5 te selecteren:

SELECT eigenaar FROM tx_zwffietsen_fietsen WHERE uid IN (SELECT fiets FROM tx_zwffietsen_fietssoort WHERE soort=3 OR soort=5);

Bij mijn weten is dit de "nette" manier om een veel-op-veel-relatie te modelleren maar dat doet TYPO3 niet. In plaats daarvan worden veel-op-veel-relaties opgelost door kommagescheiden lijsten van uid-nummers op te slaan in BLOB's. Dat werkt ook wel, maar het is niet netjes en je moet dan in PHP meer werk doen. Je moet de genummerde lijst uit elkaar trekken met bijv. de explode-functie, en dan 1 voor 1 door de resulterende array heen stappen en records ophalen. Lijkt me een erfenis uit een ver verleden, toen MySQL nog geen ondersteuning bood voor WHERE IN.

Hopelijjk kom je hier wat verder mee..

Groeten,
Bas
________________________________________
From: typo3-ug-dutch-bounces at lists.netfielders.de [typo3-ug-dutch-bounces at lists.netfielders.de] On Behalf Of Barbara Wijbenga [bwijbenga at chello.nl]
Sent: Wednesday, April 29, 2009 4:10 PM
To: typo3-ug-dutch at lists.netfielders.de
Subject: Re: [TYPO3-UG Dutch] foreign_table_where met IN statement (tca.php)

Hallo Bas,

Ik heb de extensie met Kickstarter gemaakt en die maakte er een Blob van.
Het is een Database Relation veld met maxItems = 100. Er staan dus uid's uit
een andere tabel in. Bijv. 1,3,6 wat niet in een TINYINT kan.
Het lijkt mij dat Kickstarter er het geschiktste type van maakt, of is dat
in dit geval niet zo?

Groeten,
Barbara


"Wiel, J.A.M. van de" <j.a.m.v.d.wiel at tue.nl> wrote in message
news:mailman.3822.1241013575.1775.typo3-ug-dutch at lists.netfielders.de...
Hoi Barbara,
Sorry dat ik zo ineens inval zonder de voorgeschiedenis te lezen, maar
waarom gebruik je een blob als de mogelijke waarden niet anders zijn dan 1
en 2? Een TINYINT neemt flink wat minder ruimte in beslag, en het zoekt ook
sneller. Persoonlijk vind ik blobs maar een lastig handelbaar datatype,
zeker om op te zoeken.

Wellicht werkt het beter als je de waarde tussen de haakjes quote, als
volgt:

SELECT * FROM tx_zwffietsen_soorten WHERE mogelijk IN('2');

..een blob is immers geen getal en 1 zou in dit geval ook true kunnen
betekenen waardoor het wel lijkt te werken, maar gewoon alle resultaten
teruggeeft. Wil je op meerdere waarden selecteren, dan krijg je zoiets:

SELECT * FROM tx_zwffietsen_soorten WHERE mogelijk IN('1','2');

..tenminste, zolang het veld 'mogelijk' een niet-numeriek datatype heeft.

Groeten,
Bas

________________________________________
From: typo3-ug-dutch-bounces at lists.netfielders.de
[typo3-ug-dutch-bounces at lists.netfielders.de] On Behalf Of Barbara Wijbenga
[bwijbenga at chello.nl]
Sent: Wednesday, April 29, 2009 3:46 PM
To: typo3-ug-dutch at lists.netfielders.de
Subject: Re: [TYPO3-UG Dutch] foreign_table_where met IN statement (tca.php)

Nou dacht ik dat het helemaal werkte, maar ik heb toch nog ruzie met het IN
statement:

De te selecteren records hebben bij 'mogelijk' waarde 1,2 in een blob.

Als ik in PHPmyAdmin
select * from tx_zwffietsen_soorten where mogelijk IN (1)
doe, krijg ik de goede resultaten.
Maar als ik van die 1 2 maak, krijg ik geen resultaten meer.
Waar ligt dat aan?

Gr.
Barbara


"Arjen Hoekema" <arjenhoekema at gmail.com> wrote in message
news:mailman.1.1240991332.29811.typo3-ug-dutch at lists.netfielders.de...
> Hoi Barbara,
>
> Wanneer je de waarde van een veld ophaalt waarin meerdere objecten kunnen
> worden gekoppeld (multiselect) zoals jouw categorieën krijg je helaas
> naast de "uid" ook de titel van het record binnen (<uid>|titel).
>
> Er zijn een aantal oplossingen mogelijk:
> - Geen multiselect voor de categorieën (geen optie denk ik)
> - Een reguliere expressie in de query opnemen om alles behalve getallen
> (en komma) eruit te filteren (workaround/vies)
> - Voor de select van mogelijke fietsen een eigen "itemsProcFunc" schrijven
> die de lijst met items vult (zie core api). In deze functie heb je dan
> alle vrijheid om een correcte query te maken.
>
> Owja, sowieso zou de syntax van "IN" andersom moeten:
>
> "AND tx_zwffietsen_merken.mogelijk IN (###REC_FIELD_categorie###) ORDER BY
> tx_zwffietsen_merken.sorting"
>
> Met vriendelijke groet,
>
> Arjen Hoekema
>

_______________________________________________
TYPO3-UG-Dutch mailing list
TYPO3-UG-Dutch at lists.netfielders.de
http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-ug-dutch

_______________________________________________
TYPO3-UG-Dutch mailing list
TYPO3-UG-Dutch at lists.netfielders.de
http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-ug-dutch


More information about the TYPO3-UG-Dutch mailing list