1 (edytowany przez duke_piotr 2008-12-15 11:15:24)

Temat: recursive = 4 ?

Hej macie jakies sposoby na uporanie sie z tym problemem? W 80% moje aplikacje (tabele) maja powiazania siegajace do 4 lub wiecej powiazan w glab z czego musze znac wartosci kazdej z kolejnej tabeli hmm

Czy Cake umozliwia dla upierdliwych mozliwosc zdefiniowania glebokosci penetracji ( ;] ) albo czy jest jakies proste rozwiazanie tego problemu ?


2/ Sorki za obnizenie poziomu pytania ale..... ;]

Model: ArticleTypes -> Article-> TagsHasArticle -> Tag

Kontroler: Articles i tu pytanie:
$this->Article->findAll(array(Article.types=>1).............)

jak skonstruowac (o ile sie da) warunek ArticleTypes.id =1 oraz Tag.id=1 ?? Dzieki za odpowiedz ;]

2

Odp: recursive = 4 ?

Co do pkt2:
Znalazlem taka sztuczke - mam nadzieje ze da sie prosciej bo jak tak to lepiej juz chyba uzyc prostego query():

Odbindujemy modele:

        $this->Article->unBindModel(array('hasMany'=>array('TagsHasArticle','Comment')));

A pozniej oszukujemy ze mamy relacje 1 do 1:

         $this->Article->bindModel(array('hasOne'=>array(
                        'TagsHasArticle'=>array(  
                                 'foreignKey'=>false,  
                                'conditions'=>array('Article.id = TagsHasArticle.articles_id')),  
                         'Tag'=>array(  
                         'foreignKey'=>false,  
                        'conditions'=>array('TagsHasArticle.tags_id = Tag.id')))));

W wyniku tego mozemy uzyc w findAll zarowno warynku na Tag jak i Article.

3

Odp: recursive = 4 ?

Witam,

A może rozbij to na kilka selectów?

Wyciągnij artykuły które mają ArticleType=1, potem wyciągnij id_artykułu z tabeli TagsHasArticle z warunkiem że tag_id =1 a potem bierzesz tylko elementy te elementy które powtarzają się w obu tablicach.

4

Odp: recursive = 4 ?

No tak to jest rozwiazanie ale niestety trzeba zaprzegac do tego PHP a staram sie tego unikac hmm Dlatego pytam czy jest jakis 'Magic Way' aby uniknac query.

5

Odp: recursive = 4 ?

Magic way raczej nie będzie optymalny przy takim zagnieżdżeniu hmm

Proponuję coś takiego:

$articles=$this->Article->find('all',array('criteria'=>array('ArticleType'=>1)));
$article_id_arr=$this->TagsHasArticle->find('all',array('criteria'=>array('Tag.id'=>1)));
$tmp=array();

foreach($article_id_arr as $key=>$tag_has_art){
   $tmp[]=$tag_has_art['TagHasArticle']['article_id'];
}
$result=array();
foreach($articles as $key=>$article){
   if(in_array($article['Article']['id'],$tmp)){
      $result[]=$article
   }
}

Pzdr

6

Odp: recursive = 4 ?

A nie uwazasz ze zwykle $->article->query(SELECT WHERE) w tym wypadku bedzie lepsze?

7

Odp: recursive = 4 ?

To zależy na ile chcesz korzystać z magii cake'a. Moja wersja będzie w miarę łatwa do ewentualnego przerobienia w wypadku wystąpienia takie konieczności i tylko dlatego ma dla mnie przewagę nad query. Query natomiast pewnie przeważa wydajnością. Od Ciebie zależy co jest bardziej odpowiednie.

Pzdr