v2.5.2
Giriş yap

Kategorileri Göstermek

ayarsiz
921 defa görüntülendi

Merhaba arkadaşlar sizlere bir sorum olacak.

Tablolarım;

Kategoriler Tablom
id | kategoriadi olmak üzere iki sutundan oluşuyor.

Konular Tablom
id | konuadi | katid olmak üzere üç bölümden oluşuyor.

Konularımı kaydederken birden fazla kategoriyi seçtiriyorum ve veritabanıma kayıt ediyorum..

id | konuadi | katid

1 | deneme | 1,3,5,6

yukarıdaki gibi bir şekilde mysql tablomda duruyor. ben bir türlü

konuya girdiğimde kategorilerin isimlerini yazdıramıyorum.. sadece 1 id li kategorim gözüküyor.. diğerleri görünmüyor..

nasıl bir yol izlemeliyim baya araştırdım ama hep tek kategori üzerinden gösterim yapılmış... Codeignitır yapısını kullanıyorum.. yardımcı olabilirseniz sevinirim.

Modal kodlarım

public function kategoriler($id){
   $result = $this
   ->db
   ->select('*')
   ->from('kategoriler')
   ->where('kategoriler.id',$id)
    ->join('konular','kategoriler.id=konular.katid')
   ->get()
   ->result();
   return $result;
}





Controller kodlarım

$viewData->kategoricek = $this->konular_model->kategoriler($viewData->konular->katid);

ve view kodlarım

 if (is_array($kategoricek[0]->katadi)) {

  foreach ($kategoricek as $v){ 
    echo $v->katadi;
  }

}
Cevap yaz
Cevaplar (18)
ayarsiz
1447 gün önce

Yardımcı olmaaya çalışan arkadaşlara teşekkür ederim daha basit bir yöntemle olayı çözdüm..

Böyle bir olayı arayan arkadaşlarda yararlansın diye nasıl yaptıgımı anlatıyorum..

modellerime asagıdaki gibi fonksiyon yazdım...

function kategoriadi($katid)
{
    $query  =   $this->db->get_where('kategoriler' , array('id' => $katid));
    $res    =   $query->result_array();
    foreach($res as $row)
        return $row['katadi'];
}


viewdeki konular içeriğimi gösterdiğim kısımada


$category = explode(',', $konu->katid); // Kategori idlerimi parçaladım..
foreach ($category as $category) {

echo $this->diziler_model->kategoriadi($category);

}

bu kadar basitmiş arkadaşlar:)

ayarsiz
1448 gün önce

Gelen çıktı ; stdClass Object ( [id] => 22 [kategoriadi] => Genel [kategoriid] => 1 )

böyle geliyor.. hala birtanesini çekiyor.. 2,3,4 idleri gelmiyor.. sadece en öndeki id geliyor katid deki

makifgokce
1448 gün önce

->where_in yerine ->where kullan dediğin gibi where içinde kullanılıyormuş.

ayarsiz
1448 gün önce

@maktifgokce, bildiğim kadarı ile joine değilde wherein içine yazılıyor ama yinede denedim sizin dediğin gibi ama sonuç olumsuz

makifgokce
1448 gün önce

FIND_IN_SET içerisinde = kullanmışım yanlışlıkla orayı , ile değiştirip denseydin.

ayarsiz
1448 gün önce

@makifgokce, where kısmına yazılıyor join kısmına yazdıgımda hata veriyor. ama where yazıncada istediğim sonucu elde edemeiyorum. takılıp kaldım.. yardımlarınızı bekliyrum arkadaşlar cok arastırdım ama yok bir türlü olmuyor birşey eksik ama eksik olan şeyi bulamıyorum...

yukardaki denediklerimi yaptığımda

A adlı Konuma girince, A konumun katid kısmında "1,2,3,4" yazıyorsa sadece "1" numaralı id getiriyor sadece ve devamında da B,C,D konularının İlk katid lerini veriyor bana ..

makifgokce
1448 gün önce

FIND_IN_SET i join içerisinde kullansan.codeignatir ı bilmiyorum ama aklıma başka bişey gelmedi.
->join('kategoriler',"FIND_IN_SET('konular.katid,kategoriler.kategori_id')","inner")

ayarsiz
1448 gün önce

yine ayni sonucu aliyorum… dongumdemi bi sikinti var foreach ile olmayacak mi anlamadim. ama sql ciktisindada hala bi tanetane kategorisinigosteriyor.. codeignatirda where ile yapiyorum find in set kismini..

makifgokce
1448 gün önce

böyle bir sorgu işini görür gibi.

SELECT Konular.*, GROUP_CONCAT(Kategoriler.kategoriadi) AS kategoriadi, GROUP_CONCAT(Kategoriler.id) AS kategoriid FROM Konular INNER JOIN Kategoriler ON FIND_IN_SET(Kategoriler.id, Konular.katid) WHERE Konular.id = $id GROUP BY Konular.id;
ayarsiz
1448 gün önce

sql çıktısı;

SELECT konular.*, GROUP_CONCAT(kategoriler.katadi) as kategoriadi, GROUP_CONCAT(kategoriler.kategori_id) as kategoriid FROM konular JOIN kategoriler ON konular.katid=kategoriler.kategori_id WHERE kategoriler.kategoriid = '1,2,3,4,5' AND konular.id = '16' GROUP BY konular.id

ayarsiz
1448 gün önce

@makifgokce tesekkür ederim..

@tayfunerbilen söylediğiniz şeyleri yaptım ve alttaki gibi düzenledim..

   $result = $this
   ->db
   ->select('konular.*, GROUP_CONCAT(kategoriler.katadi) as kategoriadi,GROUP_CONCAT(kategoriler.kategori_id) as kategoriid')
   ->from('konular')
   ->join('kategoriler','konular.katid=kategoriler.kategori_id',"inner")
   ->where_in("FIND_IN_SET('.$id.','konular.katid')")
   ->group_by('konular.id')
   ->get()
   ->result();
   if($result){
        return $result;
    }else{
        return FALSE;
    }
    
    
    
    gibi yaptım çıkan sonuç ; 1-13-7-6   tek o konuya ait id leri vermedi diğer konuların kategori idleri verdi sadece ilk sıradakileri bi de.
    hatam nerede acaba.. 
    
    döngüyüde şu şekilde yapıyorum..
    
     foreach ($kategoricek as $kategori) {
     echo  $kategori->kategoriid;
     }

}

tayfunerbilen
1448 gün önce

@makifgokce, ben de tam onu atacaktım :) Bu derste aslında tam olarak sorudaki olayı anlatıyorum.

makifgokce
1448 gün önce

tayfun hocanın bu dersini gördünmü bilmiyorum ama işine yarayabilir.
https://www.youtube.com/watch?v=MQoXH9yNUyo

ayarsiz
1448 gün önce

@shelby anladım. peki bu suan ki yontem ile nasıl gosterebilirim

shelby
1448 gün önce

Yetmez. Dediğim işleme ManyToMany ilişkisi deniyor. İnternete ManytoMany yazarsan daha fazla bilgi alabilirsin.

Şurada da senin tablo örneğini gösterip, böyle yapılmaz deniyor.
https://dzone.com/articles/how-to-handle-a-many-to-many-relationship-in-datab

Her sütun için değil. İlişkisel veritabanı kullanıyorsan tablolar arasında ilişki kullanmalısın. Senin dediğin gibi de yapabilirsin hem performans hem de kolaylık açısından kendine ziyet edersin.

ayarsiz
1448 gün önce

@aydinkeskin, codeigniterda pdo kullanmıyorum o yüzden bi fikir oluşmadı. pdo ile yapabiliyorum ogrenmek ıstegım codeigniterda nasıl olur.

@shelby, Konular ve Kategoriler tablolarım yetmez mi ? ben iki tabloda bu işlemi yapamıyorsam o zaman her farklı sutundan birşey çekmek istediğimde ayrı ayrı tablolar olusturmam baya sıkıntılı olur :)

hala bir çözüm bulamadım.. konular tablomdaki, katid kısmındaki virgüllerle ayrılmış kategori idlerin isimlerini konuma girindiğinde yazılsın istiyorum bir yerde eksik birşey yazıyorum ama nerede.. cunku sadece katid de ki 1,2,3 numaralardan sadece 1 idli kateorimin adını yazdırıyor ekrana.. diğerleri gözükmüyor.. döngümde sıkıntı var sanırım

shelby
1448 gün önce

Tabloların yapısı yanlış. Yeni bir tablo açıp konuların kategorilerini farklı tabloda tutman lazım.
Aşağıdaki gibi tasarlamalısın.

id | konu_id | kat_id

1 | 1 | 1
2 | 1 | 3
3 | 1 | 5
4 | 1 | 6

aydinkeskin
1448 gün önce

foreach içine bir bağlantı daha açıyorsun

ss = db->prepare(select * fron kat.... where id = id
execute.... [row->katid]

böylece yukardan gelen katid yi kategorilerdeki id ye eşitleyip sonuç olarak da
ss["katadi"]
gibi yazdırabilirsin müsait değilim gelişi güzel yazdım anlamış olmanı dilerim.