MySQL &

5 Cevap php

Ben hiyerarşileri ile kategoriler tablosunu kullanarak bir navigasyon sistemi oluşturmaya çalışıyorum. Normal olarak, aşağıdaki tablo tanımlanabilir olacaktır:

id (int) - Primary key
name (varchar) - Name of the Category
parentid (int) - Parent ID of this Category referenced to same table (Self Join)

Ama yakalamak ben Has ve çoğu (HABTM) ilişkisi Ait olduğu gibi .. bir kategori birden fazla üst kategoriye çocuk olabilir gerektirir olmasıdır.

Biliyorum ki iki tablo, kategori ve varsa öğeleri, biz HABTM ilişkileri listelemek için bir tablo katılmak categories_items kullanın. Ama burada ben iki tablo ama sadece tabloya sahip değilim ama bir şekilde kendisine HABTM ilişkileri göstermelidir. Bu, tek bir tabloyu kullanarak mümkün olacak mı? Evetse, nasıl? Bu mümkün değilse, ek birleşim tablosu oluştururken, ne kurallar (tablo adlandırma, alanlar) takip etmelidir?

Birisi bu sorun için CakePHP çözüm sağlayabilir, bu CakePHP kullanarak, bu harika olurdu başarmak için çalışıyorum. Bu mümkün olmasa bile, tablo katılmak oluşturma konusunda herhangi bir çözüm takdir edilmektedir. Zaman ayırdığınız için teşekkürler.

-- Edit -- My question seems to be a bit confusing, so I'm trying to restate what I'm looking for. In traditional self referenced (self join) parent-child relations, each item can have only one parent. What I'm looking for is to simulate a HABTM relation i.e. multiple parents for each item.

Kategoriler & Öğeleri - habtm tanımlamak için, biz categories_items masaya katılmak kullanın.

Kategoriler içinde ben habtm gerekirse, ben ne yapmalıyım?

5 Cevap

Nihayet aldım.

Naviitems Tablo:

CREATE TABLE IF NOT EXISTS `naviitems` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `linkurl` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
);

Öz Üyelik Tablo:

CREATE TABLE IF NOT EXISTS `naviitems_parents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naviitem_id` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

Naviitems Model:

<?php
class Naviitem extends AppModel {

    var $name = 'Naviitem';

    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $hasAndBelongsToMany = array(
        'Parent' => array(
            'className' => 'Naviitem',
            'joinTable' => 'naviitems_parents',
            'foreignKey' => 'naviitem_id',
            'associationForeignKey' => 'parent_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );
}
?>

Ben Cake Bake kabuk kullanarak Kontrol ve Görüntüleme elde ettik. Şimdi para cezası çalışıyor. Eğer katkıda ettik tüm fikirler için teşekkürler, bana çok yardımcı oldunuz.

Ben bu soruyu ilk kez yanlış olan, ikinci kez cevap kötü formu değildir umarım. Aşağıdaki esasen pinkgothic 's cevabın bir CakePHP uygulamasıdır.

Yeni HABTM masaya katılmak:

CREATE TABLE `categories_parent_categories` (
  `category_id` int(10) unsigned NOT NULL,
  `parent_category_id` int(10) unsigned default NULL,
  `order` int(10) unsigned NOT NULL default '0'
);

Model Derneği:

class Category extends AppModel
{
    var $hasAndBelongsToMany = array(
        'ParentCategory' => array(
            'className'             => 'Category',
            'joinTable'             => 'categories_parent_categories',
            'foreignKey'            => 'category_id',
            'associationForeignKey' => 'parent_category_id',
            'order'                 => 'CategoriesParentCategory.order'
        )
    );
}

Bir 1'e m ilişki (HABTM): Bir n sıkmak için çalışıyor n ilişki iyi bir uygulama değildir ve size temiz bir şekilde yaptım eğer olmazdı sınırlamalar içine kaçıyorum, ama bu onu (genel PHP yapabileceğini nasıl , CakePHP özgü değil):

Sen virgülle ayrılmış bir liste tüm üst kimliklerini saklamak için tablodaki bir sütun oluşturabilirsiniz. Sen kullanarak bireysel kimlikleri üzerinden okuyabilirsiniz ...

$ids = explode(',', $idsFromColumn);

... Ve geri kullanarak sütuna bunları yazmak ...

$idsForColumn = implode(',', $ids);

Veritabanının gerçek okuma-yazma, sırasıyla, bu parçacıkları önce / sonra olur.


Eğer düzgün yapmak istiyorsanız, size ana tabloda bu gibi bakmak istiyorum:

id (int) - Primary key
name (varchar) - Name of the Category

Ve n: m ilişki tabloda bu gibi bakmak:

id (int) - child
parentid (int) - parent

Bu gibi bunu sorgulamak istiyorum:

SELECT ...
FROM
    main_table AS m
    [LEFT OUTER|INNER]  JOIN
    relationship_table AS r
        ON r.id=m.id
    [LEFT OUTER|INNER] JOIN
    main_table AS n
        ON r.parentid=n.id
WHERE ...

Tam olarak ne size WHERE ve SELECT elde umuyoruz ne kadar olacak istiyorum. Eğer LEFT OUTER JOIN veya INNER JOIN isteyip istemediğinizi olarak, size m kategorileri dönmek isteyip bağlıdır. * Lütfen relationship_table bir girdisi yok ki (= herhangi bir üst yok .) Eğer sözdizimi katılmak için yeni iseniz, this Wiki article on joins bakabilirsiniz.

Bu neredeyse tam olarak ne Tree behaviour için tasarlanmış olmasıdır. Davranış üstüne inşa edilmiş MPTT (Modified Preorder Tree Traversal). Bunu böylece yapılandırmak olacaktır:

Masanıza aşağıdaki alanları ekleyin:

`parent_id` int(10) unsigned default NULL
`lft` int(10) unsigned default NULL
`rght` int(10) unsigned default NULL

Model:

class Category extends AppModel
{
    var $actsAs = array('Tree');
}

Daha sonra kategori değişiklik formları içine parent_id <select> inşa ediyorum ve Ağaç davranış kalanı dikkat çekmek istiyorum. Ben elle kategori hiyerarşisinin bir katman içinde kategorilerinin yeniden şekillendiği ele verebilir varsayalım, ama muhtemelen Ağacı ile genişletilmiş modellerde moveUp kullanarak daha iyi ve moveDown yöntemleri mevcut konum davranış.

Burada, aynı zamanda, bir Tree Helper senin görüşlerinde sipariş / sırasız listeler halinde ağaç listeleri dönüştürmek için yararlıdır.

Ne başarmak için çalışıyoruz gerçekten Kek yol yaklaşım değildir. Sen arasında bir birleşim tablo ile iki tablo kullanıyor olmalıdır. Eğer gerçekten standart kek şekilde kullanmak gerekir böylece Cake atasözünü 'yapılandırma üzerinde kongre' dir.

Habtm oluşturmak için, üç tablo isteyen olacak.

items
categories
categories_items

Beklediğiniz gibi Ürün ve Kategori vardır. Aşağıdaki gibi katılmak tablo sadece katıldı tablolar iki id içermelidir

category_id
item_id

Bu nedenle seçmelisiniz, bir gezinme öğesi birden fazla kategoride görünmesini sağlayacaktır.

Daha detaylı bilgi kitapta bulunabilir, http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM