salut, je suis debutant au cakephp, je veux afficher tous les post_id de la table TagR (qui contient : id , tag_id , post_id ) avec And operator comme ceci:
select post_id from TagR where 'tag_id' =>6 and 'tag_id' =>7 and 'tag_id' => 2 ;
j ai essayé avec cette injection , mais ca marche po :s, je ne recupere que post_id avec le tag_id => 2 (sans And tag_id=> 6 and tag_id=> 7), je sais pas ou le problem .???
$var = array(6,7,2);
$data'list_posts'] = $this->TagR->find('list',array(
'fields' => array('post_id'),
'conditions' => array('AND' => array('tag_id' => $var ))
));
J'ai besoin de votre aide je suis bloquée.. svp !!
En regardant de plus prêt ton resultat
<?php
$toto = array(
(int) 0 => array(
'TagR' => array(
'id' => '184',
'tag_id' => '2',
'post_id' => '66'
),
),
)
),
(int) 1 => array(
'TagR' => array(
'id' => '185',
'tag_id' => '6',
'post_id' => '66'
),
)
),
(int) 2 => array(
'TagR' => array(
'id' => '180',
'tag_id' => '2',
'post_id' => '65'
),
),
(int) 3 => array(
'TagR' => array(
'id' => '181',
'tag_id' => '6',
'post_id' => '65'
),
),
(int) 4 => array(
'TagR' => array(
'id' => '178',
'tag_id' => '2',
'post_id' => '64'
),
);
On voit qu'il y a le tag_id 6 et 2 qui est trouvé. Purge ton cache qui se trouve dans tmp (cela peut etre un probleme ^^')
On voit aussi ceci :
WHERE `TagR`.`tag_id` IN (6, 7, 2)
L’opération IN stipule une reduction simplification d'operation OR
Je veux bien continuer à t'aider mais la je vois pas pourquoi tu as ce type de problème :p. Si ton projet n'est pas d'ordre confidentiel, tu peux m'envoyer ton projet sur mon adresse mail : mail.mail@mail.mail
avec ton dossier cake
ta base sql test
mot de passe admin si y a besoin ^^
J'éditerais mon mail après l'envoie ou si tu ne veux pas me l'envoyer :p. C'est pas une obligation mais je suis court d'idée au niveau théorique :p parfois il vaut mieux mettre les mains dans le cambouis ^^
Je partirais plutôt sur un "OR" car tu veux afficher ton post_id si ton tag_id est égale à 6 ou 7 ou 2 et non égal 6&7&2.
$conditions = array( 'OR' => array('TagR.tag_id' => 6 ,
'TagR.tag_id' => 7 ,
'TagR.tag_id' => 2
)
);
$this->paginate'conditions'] = $conditions;
non "AND" , je veux afficher les post qui contient les tags (2,6,7). par exemple
table : post (id, name , slug, content....)
table : tag (id, name, slug)
table : TagR(id, tag_id,post_id)
post 1 : tags => 6
post 2 : tags => 7
post 3 : tags => 6,7,2
$data'list_posts'] = $this->TagR->find('list',array(
'fields' => array('post_id'),
'conditions' => array('AND' => array('tag_id' => $var ))
));
dans ce cas là , je veux récupère seulement le post 3 (tag_id =>6 and tag_id =>7 and tag_id =>2). afficher les posts qui contient les 3 tags
merci d avance...
comment peux- je faire sur cakephp : select post_id from TagR where 'tag_id' = 6 and 'tag_id' =7 and 'tag_id' = 2 ;
sachant que : TagR ( id(clé), tag_id, post_id)
Uu, j'avais pas vu la table d'association :/ (lundi avec du brouillard, bonjour...)
A terme c'est pour afficher tes posts ?
class Post extends AppModel{
public $hasAndBelongsToMany = array('Tag');
public $hasMany = array('TagR');
}
class Tag extends AppModel{
public $hasAndBelongsToMany = array('Post');
public $belongsTo = array('Category' => array('counterCache' => true));
}
class TagR extends AppModel{
public $useTable = 'posts_tags';
public $belongsTo = array('Post','Tag');
}
//table : post (id, name , slug, content....)
//table : tag (id, name, slug)
//table : TagR(id, tag_id,post_id)
mon code :
class PostsController extends AppController {
function index($tab = array()){
$this->loadModel('TagR');
$this->Post->contain('TagR');
$tab = (6,7,2); // array contient tag_id ;
$this->paginate'order'] = array('Post.created' => 'desc');
$this->paginate'conditions'] = array('AND' => array('TagR.tag_id' => $tab ));
$this->paginate'limit'] = 5;
$this->paginate'contain'] = array('Tag','Post');
$data'posts'] = $this->paginate('TagR');
}
}
merci d avance
Tu peux nous montrer la requetes qui sort en front pour voir pourquoi il y a que les tag_id 2 qui sorte.
(ps : y a la balise code <>)
\app\Controller\PostsController.php (line 131)
array(
(int) 0 => array(
'TagR' => array(
'id' => '184',
'tag_id' => '2',
'post_id' => '66'
),
'Post' => array(
'id' => '66',
'name' => 'svs2014',
'slug' => 'svs2014',
'content' => 'T-Systems will continue to seek partners with niche cloud offerings to add value to the firm’s own cloud platform by addressing industry-specific needs, which will in turn help the company expand its external revenue. T-Systems built on the cloud investments it has made in recent quarters by forming strategic alliances in 1Q13. The firm partnered with Big Data software vendor Cloudera to offer Analytics as a Service to corporate clients in Europe, with SAP to provide healthcare Software as a Service in Brazil, and with hhpberlin, a Germanybased engineering firm to develop an open source fire simulation application.',
'type' => 'post',
'created' => '2014-01-30 22:26:41',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '<p>rechnen sie das </p>',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '66',
'slug' => 'svs2014'
)
),
'Tag' => array(
'id' => '2',
'name' => 'Automotive ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '2'
)
)
),
(int) 1 => array(
'TagR' => array(
'id' => '185',
'tag_id' => '6',
'post_id' => '66'
),
'Post' => array(
'id' => '66',
'name' => 'svs2014',
'slug' => 'svs2014',
'content' => 'T-Systems will continue to seek partners with niche cloud offerings to add value to the firm’s own cloud platform by addressing industry-specific needs, which will in turn help the company expand its external revenue. T-Systems built on the cloud investments it has made in recent quarters by forming strategic alliances in 1Q13. The firm partnered with Big Data software vendor Cloudera to offer Analytics as a Service to corporate clients in Europe, with SAP to provide healthcare Software as a Service in Brazil, and with hhpberlin, a Germanybased engineering firm to develop an open source fire simulation application.',
'type' => 'post',
'created' => '2014-01-30 22:26:41',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '<p>rechnen sie das </p>',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '66',
'slug' => 'svs2014'
)
),
'Tag' => array(
'id' => '6',
'name' => 'Manufacturing ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '6'
)
)
),
(int) 2 => array(
'TagR' => array(
'id' => '180',
'tag_id' => '2',
'post_id' => '65'
),
'Post' => array(
'id' => '65',
'name' => 'svs2014',
'slug' => 'svs2014',
'content' => 'T-Systems will continue to seek partners with niche cloud offerings to add value to the firm’s own cloud platform by addressing industry-specific needs, which will in turn help the company expand its external revenue. T-Systems built on the cloud investments it has made in recent quarters by forming strategic alliances in 1Q13. The firm partnered with Big Data software vendor Cloudera to offer Analytics as a Service to corporate clients in Europe, with SAP to provide healthcare Software as a Service in Brazil, and with hhpberlin, a Germanybased engineering firm to develop an open source fire simulation application.',
'type' => 'post',
'created' => '2014-01-30 22:25:28',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '<p>rechnen sie das </p>',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '65',
'slug' => 'svs2014'
)
),
'Tag' => array(
'id' => '2',
'name' => 'Automotive ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '2'
)
)
),
(int) 3 => array(
'TagR' => array(
'id' => '181',
'tag_id' => '6',
'post_id' => '65'
),
'Post' => array(
'id' => '65',
'name' => 'svs2014',
'slug' => 'svs2014',
'content' => 'T-Systems will continue to seek partners with niche cloud offerings to add value to the firm’s own cloud platform by addressing industry-specific needs, which will in turn help the company expand its external revenue. T-Systems built on the cloud investments it has made in recent quarters by forming strategic alliances in 1Q13. The firm partnered with Big Data software vendor Cloudera to offer Analytics as a Service to corporate clients in Europe, with SAP to provide healthcare Software as a Service in Brazil, and with hhpberlin, a Germanybased engineering firm to develop an open source fire simulation application.',
'type' => 'post',
'created' => '2014-01-30 22:25:28',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '<p>rechnen sie das </p>',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '65',
'slug' => 'svs2014'
)
),
'Tag' => array(
'id' => '6',
'name' => 'Manufacturing ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '6'
)
)
),
(int) 4 => array(
'TagR' => array(
'id' => '178',
'tag_id' => '2',
'post_id' => '64'
),
'Post' => array(
'id' => '64',
'name' => 'svs2014',
'slug' => 'svs2014',
'content' => 'T-Systems will continue to seek partners with niche cloud offerings to add value to the firm’s own cloud platform by addressing industry-specific needs, which will in turn help the company expand its external revenue. T-Systems built on the cloud investments it has made in recent quarters by forming strategic alliances in 1Q13. The firm partnered with Big Data software vendor Cloudera to offer Analytics as a Service to corporate clients in Europe, with SAP to provide healthcare Software as a Service in Brazil, and with hhpberlin, a Germanybased engineering firm to develop an open source fire simulation application.',
'type' => 'post',
'created' => '2014-01-30 22:23:46',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '<p>rechnen sie das </p>',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '64',
'slug' => 'svs2014'
)
),
'Tag' => array(
'id' => '2',
'name' => 'Automotive ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '2'
)
)
)
)
dans ma datebase j ai un champ post id = 27 qui contient ces tag la 2,6,7
table : TagR
id(clé) | tag_id | post_id
194 2 27
196 6 27
197 7 27
je veux afficher tous les Post qui ont ces 3 tag avec l operateur AND ,par exemple post 27
ou y a t-il une autre alternatif ???
Je te demandais la requete généré le select qu'il y a en dessous de ta page :p
Le "truc alteratif" serait de faire un OR et ensuite de trier dans ta boucle foreach qui te permet d'afficher tes résultats. Mais je comprends pas qu'il ne t'affiche que les tag_id => 2. Si ça marchait il t'aurait affiché juste les post avec les 3 tag et si ça n'aurait pas marchait, il t'aurait affiché 0 post tout simplement. C'est pour ça que je veux voir le sql généré :p
SELECT TagR
.id
, TagR
.tag\_id
, TagR
.post\_id
, Post
.id
, Post
.name
, Post
.slug
, Post
.content
, Post
.type
, Post
.created
, Post
.online
, Post
.review
, Post
.posted
, Post
.abstract
, Post
.source
, Post
.headline
, Tag
.id
, Tag
.name
, Tag
.category\_id
FROM tsys\_vwr
.posts\_tags
AS TagR
LEFT JOIN tsys\_vwr
.posts
AS Post
ON (TagR
.post\_id
= Post
.id
) LEFT JOIN tsys\_vwr
.tags
AS Tag
ON (TagR
.tag\_id
= Tag
.id
) WHERE TagR
.tag\_id
IN (6, 7, 2) ORDER BY Post
.created
desc LIMIT 5 5 5 11
2 SELECT COUNT(*) AS count
FROM tsys\_vwr
.posts\_tags
AS TagR
LEFT JOIN tsys\_vwr
.posts
AS Post
ON (TagR
.post\_id
= Post
.id
) LEFT JOIN tsys\_vwr
.tags
AS Tag
ON (TagR
.tag\_id
= Tag
.id
) WHERE TagR
.tag\_id
IN (6, 7, 2)
mon code :
$tab = array(6,7,2);
$this->paginate'order'] = array('Post.created' => 'desc');
$this->paginate'conditions'] = array('AND' => array('TagR.tag_id' => $tab));
$this->paginate'limit'] = 5;
$this->paginate'contain'] = array('Tag','Post');
$data'posts'] = $this->paginate('TagR');
Salut,
je vais te proposer ma solution, en gardant le fait que tu veuilles tout les posts ayant des tags particuliers
dans ton model Post :
//Dans le model Post
public function getPostGroupByPostId()
{
$posts = $this->find(all,array('contain' => array('TagR' => array('Tag')),
'group' => array('Post.id'),);
return $posts;
}
//Dans le controller Posts
public function taFonction()
{
$d'posts'] = $this->Post->getPostGroupByPostId();
$this->set($d);
}
merci bcq bcq bcq xp mais j ai tjr un problem comment je peut introduire array(6,7,2) dans mafonction :
public function taFonction()
{
$tab = array(6,7,2);
$d'posts'] = $this->Post->getPostGroupByPostId($tab);
$this->set($d);
}
public function getPostGroupByPostId($k =array())
{
$posts = $this->find(all,array('contain' => array('TagR' => array('Tag')),
'group' => array('Post.id'),
'conditions' => array('and' => array(tag_id => $k))
));
return $posts;
}
Database Error:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tag_id' in 'where clause'
SQL Query: SELECT Post
.id
, Post
.name
, Post
.slug
, Post
.content
, Post
.type
, Post
.created
, Post
.online
, Post
.review
, Post
.posted
, Post
.abstract
, Post
.source
, Post
.headline
FROM tsys\_vwr
.posts
AS Post
WHERE tag\_id
IN (6, 7, 2) GROUP BY Post
.id
Notice: If you want to customize this error message, create app\View\Errors\pdo_error.ctp
Stack Trace
merci d avance:
Bon j'arrive pas à faire mieux :p. Je suis pas arriver à surcharger la conditions du paginate après avoir trouvé les articles qui correspondaient au tag... il faudrait le faire avec un find au lieu d'un paginate mais comme ça change la structure du tableau et que j'ai la flemme de recommencer :p :
1) partie modifier dans le controller :
//------------------------ fin operation pour save tags in session
// ---------------- cette parti la svp -----------------------------------
$tab = array(6,7,2); // une liste de tag , je l ai fait manuellemnt pour tester. vous pouvez commenter $tab et la remplacer
// par $taggs dans conditions
$this->paginate'order'] = array('Post.created' => 'desc');
$this->paginate'limit'] = 100;
$this->paginate'contain'] = array('Tag','Post');
$data'posts'] = $this->paginate('TagR');
//$data'posts'] = $this->Post->find('all', array('recursive' => 2,'order' => array('Post.created' => 'desc') ));
$i=0;
foreach($data'posts'] as $k => $v):
if ($v'TagR']'tag_id']==2) {
$arraycoloo$i]= $v'Post']'id'];
$i++;
}
endforeach;
$i=0;
foreach($data'posts']as $k => $v):
foreach ( $arraycoloo as $value) {
if ($v'Post']'id'] ==$value) {
if ($v'TagR']'tag_id']==6) {
$arraycoloo2$i]= $v'Post']'id'];
$i++;
}
}
}
endforeach;
$i=0;
foreach($data'posts'] as $k => $v):
foreach ( $arraycoloo2 as $value) {
if ($v'Post']'id'] ==$value) {
if ($v'TagR']'tag_id']==7) {
$arraycoloo3$i]= $v'Post']'id'];
$i++;
}
}
}
endforeach;
// ------------------------------------------------------------------------------
ajout au niveau des set :
$this->set($tag_session);
$this->set($d);
$this->set($data);
$this->set('coloo',$arraycoloo3);
modification de la boucle de la vue :
$val='coucou';
foreach($posts as $k => $v):
foreach ( $coloo as $value) {
if ($v'Post']'id'] ==$value && $val != $value) {
$val=$value;
?>
<div id="cont-results" style="min-width:700px">
<ul id="cont-results-ul" class="results">
<li>
<span class="referenz-date"><b>Updated:</b><?php echo $v'Post']'created']; ?></span>
<h3>
<?php echo $v'Post']'name']; echo ' | id : '.$v'Post']'id'] ?>
<br/>
<div style="display:none"><img src="../../img/resources/images/home/rmsm.png"/></div>
<div style="display:none"><?php echo $this->Html->image('resources/images/home/addsm.png'); ?></div>
</h3>
<div style="list-style-type:square; color: #333; padding-left: 0px; margin: 0px 0px 0px 15px;"><?php echo $this->Text->truncate($v'Post']'content'],400,array('exact'=>false,'html'=>true)); ?></div><br/>
<p><a href="<?php echo $this->Html->url($v'Post']'link']); ?>" class="more"> show all</a></p>
</li>
</ul>
</div>
<?php
}
}
endforeach;
?>
Pourquoi ça aurait était mieux avec un find ? Tout simplement car si tu mets une limite trop basse a ton paginate, les resultat ne seront pas afficher sur la premiere page de ton paginate alors qu'il y a que deux resultats :p
A toi de faire mieux et de prendre du temps pour optimiser tout ça ^^. Tu as mon mail, j'attends avec hate la solution qui marchera à coups sûr ;)
Bonjour krimovish,
tu t'es approché de ta solution mais tu l'as pas vu
le problème dans ta requête c'est que t'a mis le tableau
dans un model post qui lui n'a pas de tag_id.
Pour ta solution il suffit donc d'illustrer ce que je
t'ai donné auparavant mais avec la table de relation.
Et là tu te demandes qu'est ce qu'il veut dire?
Bref pour faire court je vais refaire ce que je t'ai donné avec
quelques modifications :
//Dans le model TagR
public function getPostGroupByPostId($k = array())
{
$posts = $this->find(all,array('contain' => array('Post','Tag'),
'group' => array('TagR.post_id'),
'conditions' => array('and' => array('TagR.tag_id' => $k)));
return $posts;
}
//Dans le controller Posts
public function taFonction($k=array())
{
//Parce que Post a plusieurs TagR tu peux faire appel à la fonction de cette manière.
$d'posts'] = $this->Post->TagR->getPostGroupByPostId($k);
$this->set($d);
}
A essayer, je ne l'ai pas testé mais je pense que c'est la bonne solution.
Superbement,
ccvf2s.
bonjour , je viens de lire ta solution ... super idee mais malheureusement ne fonction pas. merci bcq pour votre aide, :D
non :( , mais je trouve ta premiere solution super , merci bcq bcq je vais valider ta réponse ;)
je ne recois aucune erreur, il affiche tout simplement tout les post sans les regrouper par post_id
array(
(int) 0 => array(
'TagR' => array(
'id' => '194',
'tag_id' => '2',
'post_id' => '27'
),
'Post' => array(
'id' => '27',
'name' => '2020: 55% der Organisationen werden die Cloud für alle geschäftskritischen Applikationen verwenden
',
'slug' => 'allez-en-dance',
'content' => 'T-Systems will continue to seek partners.',
'type' => 'post',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '27',
'slug' => 'allez-en-dance'
)
),
'Tag' => array(
'id' => '2',
'name' => 'Automotive ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '2'
)
)
),
(int) 1 => array(
'TagR' => array(
'id' => '208',
'tag_id' => '2',
'post_id' => '31'
),
'Post' => array(
'id' => '31',
'name' => 'hkjh jhkjhkjhjk',
'slug' => 'hkjh-jhkjhkjhjk',
'content' => '<p>hhhklhlh</p>',
'type' => 'post',
'created' => '2013-12-13 14:46:20',
'online' => '1',
'review' => '0',
'posted' => '2014-01-01',
'abstract' => '',
'source' => '',
'headline' => '',
'link' => array(
'controller' => 'posts',
'action' => 'show',
'id' => '31',
'slug' => 'hkjh-jhkjhkjhjk'
)
),
'Tag' => array(
'id' => '2',
'name' => 'Automotive ',
'category_id' => '3',
'link' => array(
'controller' => 'posts',
'action' => 'index',
(int) 0 => '2'
)
)
),
....
oui :( mais c est po grave ta prèmier solution fonctionne parfait... j ai pas bcq du temps (2 jours ^^). il faut que je passe à l'etape suivante :), peux tu m informer comment je peux creer un pdf pour les posts selectionner . par exemple :
lorsque je click sur la fontion : http://localhost/test/posts/imprimer/post\_id :7 , j aimerai bien qui il me affiche un pdf qui contient (id, name, created, content,...)
merci d avance
ah donc elle marche :p C'est juste l'optimisation que tu veux pas faire x). J'étais en train de regarder si je t'avais pas envoyé le fichier avec une mauvaise version (enfin pas ma version finale ^^)
http://screencast.com/t/ojBbFw0FuPHk
Aucune idée pour le pdf mais y a déja eu des topics sur ça : http://www.grafikart.fr/forum/topic/11906
Tu peux valider la réponse. Créé un autre topic si tu as un probleme avec le pdf ou autre chose qui n'a pas de rapport avec les tag.
++
bonjour,
jette un coup d'oil sur les différentes propriétés de la fonction 'hash' de cakephp qui te permettera de préparer un tableau sur mesure que tu metteras dans 'conditions'. (tu compare un tableau qui contient tous les ids de tags dont t'as besoin avec une variable/tableau déclarée au préalable et obtenue dynamiquement à partir des ids de tags liés à tes posts; si les tableaux sont parfaitement identiques il t'affiche le résultat du find sinon tu n'obtiens rien)
si ton problème c'est de gérer les indexes et les niveaux des tableaux 'hash' peut faire ça
Exemple pour un usage compliqué :
$d'counthb'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.hb')));
Bonne chance