2017-05-09 2 views
0

Ich arbeite in CakePHP 3.4Gruppe von auf zugehörigen Modell in CakePHP

Ich habe zwei Modelle skills und skill_categories und ihre Verbindung sind wie

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

und skills ist ein Verein mit users mit dem

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

Ich muss alle zugehörigen skills des Benutzers vonauswählenTabelle Gruppierung von skills.skill_category_id die wie

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

oder wie

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

führen produzieren, was ich tue ist: Methode 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); 

Aber dies wirft Fehler als

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

Methode 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); 

Aber das gibt Fehler als

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


EDIT 2

Fähigkeiten Schema

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 Schema

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`)) 

Controller-Code

$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); 

Debug-Ausgabe

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' 

} 

Hinweis: Siehe zweites Objekt mit dem Titel Amt hat keine skills mit Benutzern zugeordnet

+0

Haben Sie versucht, die Bedingungen in das Contain zu übergeben? '$ user_skills = $ this-> SkillCategories-> find() -> enthalten (['Skills' = Funktion ($ q) use ($ user) {return $ q-> select (['id', 'user_id' , 'gelöscht', 'status']) -> where (['user_id' => $ user-> id, 'gelöscht' => false, 'status' => 0]);}]) -> group ([ 'SkillCategories.id']); ' – chrisShick

+0

Danke, es hat den Job gemacht. Machen Sie eine Antwort, damit ich es als akzeptiert markieren kann –

+0

Ich habe es nur als Antwort platziert: D – chrisShick

Antwort

1

Sie die Bedingungen in der enthalten passieren können! : 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

Hey, es gibt ein Problem mit diesem Skript. Es listet alle "Skill-Kategorien" auf, auch wenn der Benutzer sie nicht ausgefüllt hat oder nicht mit einem bestimmten Benutzer verknüpft ist. Ex. Wenn es 50 Fähigkeitskategorien gibt und der Benutzer nur Fertigkeiten aus 10 Fähigkeitskategorien zugeordnet hat, werden selbst dann alle 50 Fähigkeitskategorien aufgelistet, in denen 40 keine Verwendung haben. –

+0

@AnujTBE bist du dir sicher? Weil ich genau diese Abfrage ausgeführt habe und es für mich funktioniert. – chrisShick

+0

Ja, darüber bin ich mir sicher. Ich habe 2 Fähigkeitskategorien vom Admin-Panel hinzugefügt. Dann wurden 2 Skills in einer Skill-Kategorie hinzugefügt und die 2. Kategorie mit dem Demo-User-Panel verlassen. Wenn ich dieses Skript ausführe, werden beide Kategorien angezeigt. –

Verwandte Themen