Giriş yapmadınız.

#1 03.01.2013 17:38:33

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Fluent Builder ve Join

Merhaba arkadaşlar.
2 adet tablom var. 1. tabloda haberler, 2. tabloda da bu haberlere ait görseller bulunmakta. Yapmak istediğim şey haberleri listelerken liste içerisine habere ait ilk resmi de listeye iliştirmek.
Normalde kullandığım sorgu şu şekilde:

$data['items'] = DB::table('news')->order_by('date', 'DESC')->paginate(20);

View içerisinde 2. bir sorgu ile ilk resmi alabiliyorum fakat ben bunu tek sorgu içerisinde yapmak istiyorum.
Şu şekilde denedim fakat bir mantık hatası var:

$data['items'] = DB::table('news')
			->group_by('news.id', 'news_images.news_id')
			->left_join('news_images', 'news_images.news_id', '=', 'news.id')
			->order_by('news.date', 'DESC')->paginate(20, array('news.id', 'news.title', 'news.date', 'news_images.name'));

Bu kod ile istediğim şekilde haberleri listeliyor fakat sayfalama çalışmıyor, sayfa linkleri ekrana basılmıyor. Sayfalama limiti kaç ise o kadar kayıt gösteriliyor.
Yol gösterebilirseniz sevinirim, iyi çalışmalar...

Son düzenleyen m.erin (03.01.2013 17:46:14)

Çevrimdışı

#2 03.01.2013 20:45:19

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

view dosyanıızn içeriğini görebilmemiz mümkün mü?


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#3 03.01.2013 23:38:46

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,439
Website

Yanıt: Fluent Builder ve Join

<?php echo $items->links(); ?>

yaptınız değil mi view dosyasında?

Çevrimdışı

#4 04.01.2013 00:12:10

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

view dosyanıızn içeriğini görebilmemiz mümkün mü?

sineld yazdı:
<?php echo $items->links(); ?>

yaptınız değil mi view dosyasında?

smile

view dosyasında;

{{ $items->links(); }}

bu şekilde join yapmadan sayfalama yapılıyor. Mesele; join yapıldığında sayfalama yapılmaması.

Çevrimdışı

#5 04.01.2013 00:51:04

Echo
Üye
Kayıtlı: 30.12.2012
Mesajlar: 51
Website

Yanıt: Fluent Builder ve Join

Eloquent'la yapabilirsin.

Örnek:

News::with(array('news_image' => function($query) {
       $query->first();
}))->order_by('news.date', 'DESC')->paginate(20);

Yukarıdaki yöntemler niye yaramadı bilmiyorum ama alternatif yöntem şöyle olabilir ;
Önce sayfalama yapmadan veriyi çekersin sonra onu cache'ye atarsın 2. sorguda sayfalama kullanarak cache'den çekersin diye bir çözüm düşündüm ben teoride olur gibi pratiği bilemiyorum.

Son düzenleyen Echo (04.01.2013 00:54:56)

Çevrimdışı

#6 04.01.2013 01:27:47

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

Echo yazdı:

Eloquent'la yapabilirsin.

Örnek:

News::with(array('news_image' => function($query) {
       $query->first();
}))->order_by('news.date', 'DESC')->paginate(20);

Yukarıdaki yöntemler niye yaramadı bilmiyorum ama alternatif yöntem şöyle olabilir ;
Önce sayfalama yapmadan veriyi çekersin sonra onu cache'ye atarsın 2. sorguda sayfalama kullanarak cache'den çekersin diye bir çözüm düşündüm ben teoride olur gibi pratiği bilemiyorum.

Cevap için teşekkürler.
ORM ile pek aram olmadığı için o konuda pek bilgim yok. Cache olayı aklıma geldi ama kulağı ters elle tutmak gibi oluyor, açıkçası içime sinmiyor smile
Ayrıca haberler listelenirken her haberin kendisi için eklenen görsellerden ilki alınmalı.

Ayrıca yukarıda verdiğim kodda

->group_by('news.id', 'news_images.news_id')

satırını kaldırdığımda sayfalama için linkler basılıyor. Ama tabi bu durumda istenilen sonuçta elde edilemiyor.

Son düzenleyen m.erin (04.01.2013 01:37:29)

Çevrimdışı

#7 04.01.2013 01:40:37

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

Sorgunuzu aşağıdaki şekilde dener misiniz?

$data['items'] = DB::table('news')
			->left_join('news_images', 'news_images.news_id', '=', 'news.id')
			->order_by('news.date', 'DESC')->paginate(20, array('news.id', 'news.title', 'news.date', 'news_images.name'))
                        ->group_by('news.id', 'news_images.news_id');

Son düzenleyen drlinux (04.01.2013 01:41:09)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#8 04.01.2013 01:43:59

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

Sorgunuzu aşağıdaki şekilde dener misiniz?

$data['items'] = DB::table('news')
			->left_join('news_images', 'news_images.news_id', '=', 'news.id')
			->order_by('news.date', 'DESC')->paginate(20, array('news.id', 'news.title', 'news.date', 'news_images.name'))
                        ->group_by('news.id', 'news_images.news_id');

group_by yordamını paginate yordamından sonra kullanamıyoruz.

Call to undefined method Laravel\Paginator::group_by()

Çevrimdışı

#9 04.01.2013 01:45:38

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

pardon benim hatam, şu şekilde denemeniz gerekirdi :

$data['items'] = DB::table('news')
			->left_join('news_images', 'news_images.news_id', '=', 'news.id')
			->order_by('news.date', 'DESC')
                        ->group_by('news.id', 'news_images.news_id')->paginate(20, array('news.id', 'news.title', 'news.date', 'news_images.name'));

Son düzenleyen drlinux (04.01.2013 01:46:02)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#10 04.01.2013 01:48:41

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

ayrıca blade kullanırken

{{bla();}}

şeklinde kullnıma gerek yok,

 {{bla()}}

yeterli.


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#11 04.01.2013 01:53:37

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

pardon benim hatam, şu şekilde denemeniz gerekirdi :

$data['items'] = DB::table('news')
			->left_join('news_images', 'news_images.news_id', '=', 'news.id')
			->order_by('news.date', 'DESC')
                        ->group_by('news.id', 'news_images.news_id')->paginate(20, array('news.id', 'news.title', 'news.date', 'news_images.name'));

İlginiz için teşekkürler. Ancak group_by yordamının başta veya sonra olması sorguyu değiştirmiyor. Çünkü bu zincirleme bir işlem ve verilen parametreler bir çalıştırıcı fonksiyon ile belirli bir sıraya göre derlenip uygun sql kodu oluşturuluyor.
Buradaki sıkıntının group_by yordamından kaynaklandığı kesin ama problem başka bir şey smile

Çevrimdışı

#12 04.01.2013 01:54:50

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

ayrıca blade kullanırken

{{bla();}}

şeklinde kullnıma gerek yok,

 {{bla()}}

yeterli.

noktalı virgül klavye alışkanlığı, teşekkürler smile

Son düzenleyen m.erin (04.01.2013 01:55:36)

Çevrimdışı

#13 04.01.2013 01:56:29

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

fluent kullanmadığım için fluent classın nasıl çalıştığına pek ilgi gösteremedim. Eloquent candır. wink


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#14 04.01.2013 01:57:25

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

fluent kullanmadığım için fluent classın nasıl çalıştığına pek ilgi gösteremedim. Eloquent candır. wink

Bu 2 oldu smile
O zaman Eloquent ile canlı örnek alabilir miyim? big_smile

Çevrimdışı

#15 04.01.2013 02:15:51

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

Veri tabanı yapınızı tam olarak bilemediğim aşağıda has_one methodunu kullandım.

Aşağıdaki şekildeki gibi bir şey olması gerekiyor.

Buradaki linkten geniş bilgi alabilirsiniz : http://www.laravel.com/docs/database/eloquent

class News extends Eloquent {

     public function news_images()
     {
          return $this->has_one('Newsimages','news_id');
     }

}
News::news_images()->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#16 04.01.2013 02:22:23

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:

Veri tabanı yapınızı tam olarak bilemediğim aşağıda has_one methodunu kullandım.

Aşağıdaki şekildeki gibi bir şey olması gerekiyor.

Buradaki linkten geniş bilgi alabilirsiniz : http://www.laravel.com/docs/database/eloquent

class News extends Eloquent {

     public function news_images()
     {
          return $this->has_one('Newsimages','news_id');
     }

}
News::news_images()->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Tablo yapım şu şekilde:
news
id, title, content, date
news_images
id, news_id, name

Verdiğiniz örnekteki model dosyasını oluşturdum ve kodu denedim. Aşağıdaki hatayı alıyorum:

Non-static method News::news_images() should not be called statically, assuming $this from incompatible context

Çevrimdışı

#17 04.01.2013 02:29:29

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

//models/news.php
class News extends Eloquent {
     
     public static $table = 'news';

     public function news_images()
     {
          return $this->belongs_to('Newsimages','news_id');
     }

}
News::with('news_images')->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Yukarıdaki şekilde olması gerekiyor. En kötü ihtimal raw query yazarsınız...

Son düzenleyen drlinux (04.01.2013 02:33:56)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#18 04.01.2013 02:44:11

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:
//models/news.php
class News extends Eloquent {
     
     public static $table = 'news';

     public function news_images()
     {
          return $this->belongs_to('Newsimages','news_id');
     }

}
News::with('news_images')->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Yukarıdaki şekilde olması gerekiyor. En kötü ihtimal raw query yazarsınız...

Şu geç saatte uğraştınız teşekkür ederim.

News Object
(
    [attributes] => Array
        (
            [id] => 2
            [title] => Test haber
            [date] => 2013-01-03 16:55:15
        )

    [original] => Array
        (
            [id] => 2
            [title] => Test haber
            [date] => 2013-01-03 16:55:15
        )

    [relationships] => Array
        (
            [news_images] => Newsimages Object
                (
                    [attributes] => Array
                        (
                            [id] => 3
                            [news_id] => 2
                            [name] => hydrangeas-Q5dMQBSq-I9dDhmdi.jpg
                        )

                    [original] => Array
                        (
                            [id] => 3
                            [news_id] => 2
                            [name] => hydrangeas-Q5dMQBSq-I9dDhmdi.jpg
                        )

                    [relationships] => Array
                        (
                        )

                    [exists] => 1
                    [includes] => Array
                        (
                        )

                )

        )

    [exists] => 1
    [includes] => Array
        (
        )

)

Çıktıya dikkat ederseniz her haber için bütün resimleri sorguluyor. Yalnızca ilkini almasını sağlayabilir miyiz?
Ayrıca view kısmında bu alınan tek resmin ismini nasıl alabilirim?

Son düzenleyen m.erin (04.01.2013 02:45:47)

Çevrimdışı

#19 04.01.2013 02:51:16

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

first();

methodunu kullanabilirsiniz: http://laravel.com/docs/database/eloquent#one-to-one


News::with('news_images')->first()->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Son düzenleyen drlinux (04.01.2013 02:54:32)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#20 04.01.2013 03:02:55

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

drlinux yazdı:
first();

methodunu kullanabilirsiniz: http://laravel.com/docs/database/eloquent#one-to-one


News::with('news_images')->first()->group_by('id','news_id')->order_by('date','desc')->paginate(20, array('id', 'title', 'date'));

Maalesef bu şekilde kullanınca resimlerle ilgili hiç sonuç dönmüyor. Ayrıca view kısmında resim ismini nasıl alabiliriz?

News Object
(
    [attributes] => Array
        (
            [id] => 2
            [title_tr] => Test haber
            [date] => 2013-01-03 16:55:15
        )

    [original] => Array
        (
            [id] => 2
            [title_tr] => Test haber
            [date] => 2013-01-03 16:55:15
        )

    [relationships] => Array
        (
        )

    [exists] => 1
    [includes] => Array
        (
        )

)

Son düzenleyen m.erin (04.01.2013 03:04:03)

Çevrimdışı

#21 04.01.2013 12:44:36

Echo
Üye
Kayıtlı: 30.12.2012
Mesajlar: 51
Website

Yanıt: Fluent Builder ve Join

Bu işini görecektir. Uyguladığın filtrelere göre haberleri çeker ve haberlerin yanında da bir tane haber resmi çeker.

class News extends Eloquent {
     
     public static $table = 'news';

     public function news_images()
     {
          return $this->belongs_to('Newsimages','news_id')->take(1);
     }

}
News::with('news_image')->order_by('news.date', 'DESC')->paginate(20);

Son düzenleyen Echo (04.01.2013 12:45:45)

Çevrimdışı

#22 04.01.2013 14:00:02

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

Echo yazdı:

Bu işini görecektir. Uyguladığın filtrelere göre haberleri çeker ve haberlerin yanında da bir tane haber resmi çeker.

class News extends Eloquent {
     
     public static $table = 'news';

     public function news_images()
     {
          return $this->belongs_to('Newsimages','news_id')->take(1);
     }

}
News::with('news_image')->order_by('news.date', 'DESC')->paginate(20);

Teşekkür ederim @Echo.
Peki view kısmında resim tablosundaki name isimli veriyi nasıl alabilirim.
Yani foreach içerisinde news isimli tablonun verilerini alabiliyorum. news_images tablosundaki name değerini almam gerek.

controller

$data['items'] = News::with('news_image')->order_by('news.date', 'DESC')->paginate(20);

view

foreach ($items as $item)
{
    echo $item->id . ' - ' . $item->title . ' - ' . $item->name;
}

gibi...

Son düzenleyen m.erin (04.01.2013 14:00:30)

Çevrimdışı

#23 04.01.2013 19:43:10

m.erin
Üye
Yer: Konya
Kayıtlı: 26.12.2012
Mesajlar: 165
Website

Yanıt: Fluent Builder ve Join

Resmin ismini şu şekilde alabildim:

@forelse ($items->results as $item)
    <p>
    {{ $item->title }} - 
    @forelse ($item->news_image as $image)
        {{ isset($image['name']) ? $image['name'] : NULL; }}
    @empty
        Resim yok
    @endforelse
    </p>
@empty
- Kayıt yok
@endforelse

Çevrimdışı

#24 05.01.2013 13:51:43

Echo
Üye
Kayıtlı: 30.12.2012
Mesajlar: 51
Website

Yanıt: Fluent Builder ve Join

@m.erin

@forelse

yerine

@foreach

yazacaktınız sanırım smile

Çevrimdışı

#25 05.01.2013 13:57:09

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Fluent Builder ve Join

@m.erin işlerin yoğunluğundan dolayı zamanında yanıt veremediğim için kusura bakmayın. @Echo arkadaşa teşekkür ederim kodu fixlediği için. Gece 3'te verilen cevaplarda bug olmasa şaşardım zaten tongue

Son düzenleyen drlinux (05.01.2013 13:57:25)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

Forum alt kısmı