2017-05-09 1 views
0

Je travaille dans CakePHP 3.4groupe par le modèle associé à CakePHP

J'ai deux modèles skills et skill_categories et leur association sont comme

skill_categories->hasMany('skills'); 
skills->belongsTo('SkillCategories', 'joinType' => 'INNER') 

et skills est d'avoir une association avec users

skills->belongsTo('users') 
users->hasMany('Skills') 

Je dois sélectionner tous les associés skills de l'utilisateur de skills groupement de table par skills.skill_category_id qui produira le résultat comme

Skill Category 1 
|-- Skill 11 
|-- Skill 12 
|-- Skill 13 
Skill Category 2 
|-- Skill 21 
|-- Skill 22 

ou comme

'skill_categories' => [ 
     'title' => 'Skill Category 1', 
     'id' => 1, 
     'skills' => [ 
      0 => [ 
       'title' => 'Skill 11', 
       'id' => 4, 
      ], 
      1 => [ 
       'title' => 'Skill 12', 
       'id' => 6, 
      ] 
     ], 
] 

Ce que je fais est la suivante: Méthode 1

$user_skills = $this->Skills->find() 
     ->select(['Skills.skill_category_id', 'Skills.title', 'Skills.measure', 'SkillCategories.title', 'Skills.id']) 
     ->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0]) 
     ->contain(['SkillCategories']) 
     ->group(['Skills.skill_category_id']); 

     foreach($user_skills as $s)debug($s); 

Mais c'est de lancer erreur

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'profPlus_db_new.Skills.title' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Méthode 2

$user_skills = $this->SkillCategories->find() 
     ->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0]) 
     ->contain(['Skills']) 
     ->group(['SkillCategories.id']); 

     foreach($user_skills as $s)debug($s); 

Mais cela donne erreur

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Skills.user_id' in 'where clause'


EDIT 2

compétences schéma

CREATE TABLE IF NOT EXISTS `skills` (
    `id` CHAR(36) NOT NULL, 
    `user_id` CHAR(36) NOT NULL, 
    `skill_category_id` CHAR(36) NOT NULL, 
    `title` VARCHAR(250) NOT NULL, 
    `measure` INT NOT NULL DEFAULT 0, 
    `status` INT NULL DEFAULT 0, 
    `deleted` TINYINT(1) NULL DEFAULT 0, 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    `modified` DATETIME NULL, 
    PRIMARY KEY (`id`) 
) 

skill_categories schéma

CREATE TABLE IF NOT EXISTS `skill_categories` (
    `id` CHAR(36) NOT NULL, 
    `title` VARCHAR(200) NOT NULL, 
    `status` INT NULL DEFAULT 0, 
    `deleted` TINYINT(1) NULL DEFAULT 0, 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    `modified` DATETIME NULL, 
    PRIMARY KEY (`id`)) 

code de contrôleur

$user_skills = $this->SkillCategories->find() 
    ->contain([ 
     'Skills' => function($q) use($user) { 
      return $q 
      ->select(['id', 'skill_category_id', 'title', 'measure', 'user_id', 'deleted', 'status']) 
      ->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]); 
    }]) 
    ->group(['SkillCategories.id']); 

    foreach($user_skills as $s)debug($s); 

débogage sortie

object(App\Model\Entity\SkillCategory) { 

'id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d', 
'title' => 'Programming', 
'status' => (int) 0, 
'deleted' => false, 
'skills' => [ 
    (int) 0 => object(App\Model\Entity\Skill) { 

     'id' => '36f16f7f-b484-4fd8-bfc5-4408ce97ff23', 
     'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d', 
     'title' => 'PHP', 
     'measure' => (int) 92, 
     'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad', 
     'deleted' => false, 
     'status' => (int) 0, 
     '[repository]' => 'Skills' 

    }, 
    (int) 1 => object(App\Model\Entity\Skill) { 

     'id' => '4927e7c1-826a-405d-adbe-e8c084c2b9ef', 
     'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d', 
     'title' => 'CakePHP', 
     'measure' => (int) 90, 
     'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad', 
     'deleted' => false, 
     'status' => (int) 0, 
     '[repository]' => 'Skills' 
    } 
], 
'[repository]' => 'SkillCategories' 

} 

object(App\Model\Entity\SkillCategory) { 

'id' => 'd55a2a95-05a0-410e-9a55-1a1509f76b8c', 
'title' => 'Office', 
'status' => (int) 0, 
'deleted' => false, 
'skills' => [], 
'[repository]' => 'SkillCategories' 

} 

Remarque: Voir 2ème objet avec le titre Bureau n'a pas skills associé à l'utilisateur

+0

Avez-vous essayé de transmettre les conditions dans le conteneur? '$ user_skills = $ this-> SkillCategories-> find() -> contains (['Compétences' = fonction ($ q) use ($ user) {return $ q-> select (['id', 'user_id' , 'deleted', 'status']) -> où (['user_id' => $ utilisateur-> id, 'deleted' => false, 'status' => 0]);}]) -> group ([ 'SkillCategories.id']); ' – chrisShick

+0

Merci, il a fait le travail. Réponds-y pour que je puisse le marquer comme accepté –

+0

Je l'ai juste placé comme réponse: D – chrisShick

Répondre

1

Vous pouvez passer les conditions dans le contenir! : D

$user_skills = $this->SkillCategories->find() 
    ->contain(['Skills' => function($q) use($user) { 
     return $q 
     ->select(['id', 'user_id', 'deleted', 'status', 'skill_category_id']) 
     ->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]); 
    }]) 
    ->group(['SkillCategories.id']); 
+0

Hé, il y a un problème avec ce script. Il répertorie toutes les «catégories de compétences» même si l'utilisateur ne l'a pas rempli ou n'est pas associé à un utilisateur particulier. Ex. S'il y a 50 catégories de compétences et que l'utilisateur n'a que des compétences associées à 10 catégories de compétences, même dans ce cas, il énumère les 50 catégories de compétences où 40 sont inutiles. –

+0

@AnujTBE en êtes-vous sûr? Parce que j'ai exécuté cette requête exacte et cela fonctionne pour moi. – chrisShick

+0

oui, j'en suis sûr. J'ai ajouté 2 catégories de compétences du panneau d'administration. Puis ajouté 2 compétences dans une catégorie de compétences en laissant derrière la deuxième catégorie en utilisant le panneau d'utilisateur de démonstration. Quand j'exécute ce script, il montre les deux catégories. –