Nasıl HABTM ilişkileri kullanarak CakePKP'deki veri sorgulayabilir mi?

4 Cevap php

Ben bir CakePHP 1.2 uygulama üzerinde çalışıyorum. Ben katılmak tablo ile diğer tablolar ile birkaç HABTM ilişkileri ile tanımlanan bir model "Kullanıcı" var.

Ben şimdi bu HABTM tablolardan biri depolanan verilere dayalı Kullanıcı bilgileri bulmakla görevli değilim. Sorgu yürütür, ne yazık ki, benim durumum bir eksik tablo hakkında bir hata ile reddedilir. Incelenmesi üzerine CakePHP select deyiminde HABTM tablolardan herhangi dahil değil gibi görünüyor.

Aşağıdaki gibi benim kullanıcı HABTM ilişki:

    var $hasAndBelongsToMany = array(
	'Course' => array(
		'className'        	    => 'Course',
		'joinTable'              => 'course_members',
		'foreignKey'             => 'user_id',
		'associationForeignKey'  => 'course_id',
		'conditions'             => '',
		'order'                  => '',
		'limit'                  => '',
		'uniq'                   => false,
		'finderQuery'            => '',
		'deleteQuery'            => '',
		'insertQuery'            => ''
	),
	'School' => array(
		'className'        	    => 'School',
		'joinTable'              => 'school_members',
		'foreignKey'             => 'user_id',
		'associationForeignKey'  => 'school_id',
		'conditions'             => '',
		'order'                  => '',
		'limit'                  => '',
		'uniq'                   => false,
		'finderQuery'            => '',
		'deleteQuery'            => '',
		'insertQuery'            => ''
	),
	'Team' => array(
		'className'        	    => 'Team',
		'joinTable'              => 'team_members',
		'foreignKey'             => 'user_id',
		'associationForeignKey'  => 'team_id',
		'conditions'             => '',
		'order'                  => '',
		'limit'                  => '',
		'uniq'                   => false,
		'finderQuery'            => '',
		'deleteQuery'            => '',
		'insertQuery'            => ''
	)
);

Hata:

SQL Error: 1054: Unknown column 'School.name' in 'where clause'

Ve nihayet, sorgu çalıştırmak için çalışıyor

     SELECT 
 `User`.`id`, `User`.`username`, `User`.`password`, `User`.`firstName`, `User`.`lastName`, `User`.`email

`, `User`.`phone`, `User`.`streetAddress`, `User`.`city`, `User`.`province`, `User`.`country`, `User

`.`postal`, `User`.`userlevel`, `User`.`modified`, `User`.`created`, `User`.`deleted`, `User`.`deleted_date

` FROM `users` AS `User`   WHERE `User`.`id` = 6 AND `School`.`name` LIKE '%Test%'    LIMIT 1

4 Cevap

2 hata ayıklama seviyesini yukarı çevirin ve SQL çıktı bak. Kod üreten sorgu bulun ve birkaç vardır fark edeceksiniz. CakePHP ORM katman ilk sorguda HABTM ilgili tabloları katılmak değil. Bu ilk seçme sonuçlarını alır, daha sonra ayrı ayrı her madde için HABTM veri getirir. Katılmak tablo, ilk sorguda katıldı masanın üzerinde kullanılmak üzere tasarlanmıştır durumunuz değildir çünkü, gördüğünüz hata ile sonuçlanır.

Yemek kitabı, bir HABTM associations bölüm ve gereksinimlerine uyacak HABTM tabloda koşullara dayalı getiriliyor veri var.

Yemek Tarifleri Gönderen: http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

Bir seçenek de bize ilişkili Tarifler tüm verecektir Etiket modeli (yerine tarifi), arama etmektir.

$this->Recipe->Tag->find('all', array(
    'conditions' => array('Tag.name' => 'Dessert')));

Biz de belirli bir kimlik aramak için, (CakePHP bize sağlayan) join tablo modeli kullanabilirsiniz.

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag')));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('RecipesTag.tag_id' => 124) // id of Dessert
));

Bu kadar, örneğin, filtreleme olanak sağlayacak şekilde gerekli katılır oluşturmak amacıyla egzotik bir ilişki oluşturmak da mümkündür:

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag',
    'FilterTag' => array(
        'className' => 'Tag',
        'foreignKey' => false,
        'conditions' => array('FilterTag.id = RecipesTag.tag_id')
))));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('FilterTag.name' => 'Dessert')
));

Birçok-çok, bu nedenle her iki tarafta tablo adı çoğul formu kullanarak uygun olanı olduğunu çünkü senin masa "schools_users" ve "school_members" aranmalıdır.

Ayrıca habtm için Alias ​​olarak Model ClassName "Okul" olarak ayarlayın. Sen çatışmaları önlemek için "Kullanıcı olduğunu ve sahip pek çok okulda" gibi, "Okullar" gibi daha genel bir şey değiştirmek gerekir.

Ve başka bir ipucu: Okul Modeli ziyade Kullanıcı Modeli "üzerinden" kullanıcı bulmaya çalışın.

$ This-> User-> Okullar-> find ()

Umarım bu yardımcı olur.

Onlar kongre Burada tarif takip etmemektedir FWIW, senin katılmak tablolar ölçüde "tuhaf adlı" gibi görünüyor:

http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

Her durumda, iyi şanslar, ben HABTM CakePKP'deki bir popo-ağrı hatırlıyorum.