Kategorileri Göstermek
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;
}
}
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (18)
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:)
->where_in
yerine ->where
kullan dediğin gibi where
içinde kullanılıyormuş.
FIND_IN_SET
içerisinde =
kullanmışım yanlışlıkla orayı ,
ile değiştirip denseydin.
@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 ..
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")
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;
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
@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;
}
}
@makifgokce, ben de tam onu atacaktım :) Bu derste aslında tam olarak sorudaki olayı anlatıyorum.
tayfun hocanın bu dersini gördünmü bilmiyorum ama işine yarayabilir.
https://www.youtube.com/watch?v=MQoXH9yNUyo
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.
@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
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.