Bonjour
Je me suis faite un systène de tags général pour tout le site web. Ma table Tags as les champ suivant :

id
ref_id : L'id de l'enregistrement d'un post, d'une tune, ou d'un utilsateur
ref : le nom du modèle 
created

Je me suis fait un behavior Tag pour que ce comportement soi accessible à tout mes modèle.

Je veux éxécuter cette requête :

    $tag = $this->Tag->find('first',array(
            'conditions' => array('Tag.slug' => $slug),
            'contain' => array('Post','Track','User')
        ));

Quand je fait un debug de ma variable : $tag

ça me retourne ce-ci :

array(
    'Tag' => array(
        'id' => '1',
        'name' => 'I'm a tag!!!!!!',
        'slug' => 'i-m-a-tag',
        'ref' => 'post',
        'ref_id' => '5',
        'created' => null,
        'link' => array(
            'controller' => 'tags',
            'action' => 'show',
            'slug' => 'i-m-a-tag'
        )
    ),
    // tout les post qui ont ce tag 
    // tout les tune qui ont ce tag 
    etc.

Voci le code source de mon behavior :

public function setup(Model $model,$config = array()) {
        $model->tags = array_merge($config);
        $model->hasMany['Tag'] = array(
            'className'     => 'Tag',
            'foreignKey'    => 'ref_id',
            'conditions'    => 'ref = "'.$model->name.'"',
            'dependent'     => true
        );
    }

Merci de votre aide.

7 réponses


Il faut que tu déclare les hasMany dans le model Tag

lakamark
Auteur

À la façon classique?


public $hasMany = array('Post','Track');
lakamark
Auteur

Ok ça fonctionne, mais je trouve que je me répète beaucoup :

public $hasMany = array(
        'Post' =>array(
            'foreignKey' => 'id'
        ),
        'Track' => array(
            'foreignKey' => 'id'
        ),
        'User' => array(
            'foreignKey' => 'id'
        )
    );

alors est-ce que c'es possible d'automatiser grâce au behavior.

Je ne pense pas que ça soit possible tu va être un peu bloqué là :(

lakamark
Auteur

J'ai pas le choix de faire cette configuration manuel?

lakamark
Auteur

J'ai un autre problème j'ai des conflits entre mes models. Le modèle Tags récupère mal les données :

'Tag' => array(
        'id' => '2',
        'name' => 'dd',
        'slug' => 'dd',
        'ref' => 'Post',
        'ref_id' => '1',
        'created' => '2015-02-22 22:13:52',
        'link' => array(
            'controller' => 'tags',
            'action' => 'show',
            'slug' => 'dd'
        )
    ),
    'Post' => array(
        (int) 0 => array(
            'id' => '2',
            'name' => 'Deuxime',
            'type' => 'Post',
            'slug' => 'dexieme',
            'content' => '<p>teste</p>',
            'created' => '2015-01-06 20:34:21',
            'user_id' => '1',
            'category_id' => '2',
            'link' => array(
                'controller' => 'posts',
                'action' => 'show',
                'slug' => 'dexieme'
            )
        )
    ),
    'Track' => array(),
    'User' => array(
        (int) 0 => array(
            'password' => '*****',
            'id' => '2',
            'username' => 'Teste1',
            'slug' => 'teste1',
            'mail' => 'exemple@exemple.com',
            'firstname' => null,
            'lastname' => null,
            'bio' => null,
            'thumb' => null,
            'language' => null,
            'active' => '1',
            'token' => '',
            'created' => '2015-01-12 15:59:37',
            'role' => 'member',
            'end_subscription' => null,
            'soundcloud_id' => '0',
            'facebook_id' => '0'
        )
    )

Ce tag est à le référent : Post et L'id 1. Techniquement ma table Track et Users devrais être vide.

lakamark
Auteur

Comment je peut faire pour régler ce conflit entre mes models?