Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 22.01.2019 09:37:05

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Detaylı arama

Merhaba arkadaşlar kolay gelsin, detaylı hasta arama sayfası yapmak istiyorum, fakat bunu yaparken bazı inputları seçmiyorum,  mesala şu tarihler arası il dışından şu tanı ile şu hastaneye  gelen hastaları getir diye bir arama yapmak istiyorum, seçmediğim inputlar  için veritabanı karşılıklarında değer bulunduğu için sorgumun değeri 0 sonuç olarak dönüyor. sadece seçtiğim kriterlere sahip dataların geleceği şekilde sorgumu nasıl yaparım yardımcı olursanız sevinirim.
Hasta Kayıt Formu
1.jpg

Hasta Arama Formu
3.jpg

Controller

public function store(Request $request)
    {

       //return $request->all();
        $baslama_tarih = $request->baslama_tarih." 00:00:00";
        $bitis_tarih   = $request->bitis_tarih." 23:59:59";
        $il_durum      = $request->il_durum;
        $sehir         = $request->sehir;
        $kategori      = $request->kategori;
        $basamak       = $request->basamak;
        $hasta         = $request->hasta_adi;
        $mernis_no     = $request->mernis_no;
        $uyruk         = $request->uyruk;
        $cinsiyet      = $request->cinsiyet;
        $gun           = $request->gun;
        $hafta         = $request->hafta;
        $ay            = $request->ay;
        $yas           = $request->yas;
        $sevk_eden_hastane   = $request->sevk_eden_hastane;
        $kabul_eden_hastane  = $request->kabul_eden_hastane;
        $ekip          = $request->ekip;
        $transport     = $request->transport;
        $sehir_disi    = $request->sehir_disi;
        $tani          = $request->tani;
        $tani_detay    = $request->tani_detay;
        $durum         = $request->durum;
        $sonlandi      = $request->sonlandi;
        $entube        = $request->entube;
        $anne_karninda = $request->anne_karninda;
        $askom         = $request->askom;

               $veriler=Patient::whereBetween('baslama_tarih', [$baslama_tarih, $bitis_tarih])
               ->where('il_durum','LIKE','%'.$il_durum.'%')
               ->where('sehir','LIKE','%'.$sehir.'%')
               ->where('kategori','LIKE','%'.$kategori.'%')
               ->where('basamak','LIKE','%'.$basamak.'%')
               ->where('hasta','LIKE','%'.$hasta.'%')
               ->where('mernis_no','LIKE','%'.$mernis_no.'%')
               ->where('uyruk','LIKE','%'.$uyruk.'%')
               ->where('cinsiyet','LIKE','%'.$cinsiyet.'%')
               ->where('gun','LIKE','%'.$gun.'%')
               ->where('hafta','LIKE','%'.$hafta.'%')
               ->where('ay','LIKE','%'.$ay.'%')
               ->where('yas','LIKE','%'.$yas.'%')
               ->where('sevk_eden_hastane','LIKE','%'.$sevk_eden_hastane.'%')
               ->where('kabul_eden_hastane','LIKE','%'.$kabul_eden_hastane.'%')
               ->where('ekip','LIKE','%'.$ekip.'%')
               ->where('transport','LIKE','%'.$transport.'%')
               ->where('sehir_disi','LIKE','%'.$sehir_disi.'%')
               ->where('tani','LIKE','%'.$tani.'%')
               ->where('tani_detay','LIKE','%'.$tani_detay.'%')
               ->where('durum','LIKE','%'.$durum.'%')
               ->where('sonlandi','LIKE','%'.$sonlandi.'%')
               ->where('entube','LIKE','%'.$entube.'%')
               ->where('anne_karninda','LIKE','%'.$anne_karninda.'%')
               ->where('askom','LIKE','%'.$askom.'%')
               ->get();
               return view('front.partials.arama.index',compact('veriler'));
    }

Hasta Arama Formu
4.jpg

Çevrimdışı

#2 22.01.2019 10:02:13

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,500
Website

Yanıt: Detaylı arama

Çevrimdışı

#3 22.01.2019 10:22:08

Kevin-Mitnick
Üye
Kayıtlı: 26.05.2016
Mesajlar: 452

Yanıt: Detaylı arama

Uzun yoldan yapılabilir boş olup olmadıklarını sınayıp ona göre sorguya ekleyebilirsin dolu olanları


Mister Koder

Çevrimdışı

#4 22.01.2019 10:26:10

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

mgsmus yazdı:

üstad çok karışık geldi inan hiç birşey anlamadım bu kez smile

Çevrimdışı

#5 22.01.2019 10:26:56

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

Kevin-Mitnick yazdı:

Uzun yoldan yapılabilir boş olup olmadıklarını sınayıp ona göre sorguya ekleyebilirsin dolu olanları

işte bunu nasıl yapacaz tüm mesele burada smile)

Çevrimdışı

#6 22.01.2019 10:36:07

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 394

Yanıt: Detaylı arama

baba naptın ya smile bu sorgu stabil çalışmaz ilerde.Hunharca like yapmışsın.Elasticsearch öğrenmelisin zamanı gelmiş bence.

gelen request datasını whitelistten gecir oyle işlem yap.her bir requesti deli gomleği bağlar gibi yazmıssın.Böyle bir kod yapısı senin şevkini bozar ben sana diyim smile

$whiteList = [....buraya fieldlerini koy];

Table::where(function($query) use($request,$whiteList){

foreach($request->all() as $key=>$value){

if(in_array($key,$whiteList){

$query->where($key,$value);

}

})->get();

Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#7 22.01.2019 10:38:20

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

deathisonitsway yazdı:

baba naptın ya smile bu sorgu stabil çalışmaz ilerde.Hunharca like yapmışsın.Elasticsearch öğrenmelisin zamanı gelmiş bence.

gelen request datasını whitelistten gecir oyle işlem yap.her bir requesti deli gomleği bağlar gibi yazmıssın.Böyle bir kod yapısı senin şevkini bozar ben sana diyim smile

$whiteList = [....buraya fieldlerini koy];

Table::where(function($query) use($request,$whiteList){

foreach($request->all() as $key=>$value){

if(in_array($key,$whiteList){

$query->where($key,$value);

}

})->get();

Eyvalla üstad, siz değerli üstadlarımıza sorup hergün yeni bişeyler öğreniyoruz smile) acemilik işte ! bu şekilde çözebiliriz degil mi ?

Son düzenleyen GkyKrkc (22.01.2019 10:38:39)

Çevrimdışı

#8 22.01.2019 10:40:51

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 394

Yanıt: Detaylı arama

çözersin whiteList yapmayı unutma..yoksa request->all() canını sıkabilir...ama dediğim gibi sorgu ilerde başını ağrıtır.


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#9 22.01.2019 10:46:43

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

teşekkür ederim deneyip dönecem

Çevrimdışı

#10 22.01.2019 12:26:26

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

deathisonitsway yazdı:

çözersin whiteList yapmayı unutma..yoksa request->all() canını sıkabilir...ama dediğim gibi sorgu ilerde başını ağrıtır.

$whiteList = ['user_id',
            'baslama_tarih',
            'bitis_tarih',
            'il_durum',
            'sehir',
            'kategori',
            'basamak',
            'hasta_adi',
            'mernis_no',
            'uyruk',
            'cinsiyet',
            'gun',
            'hafta',
            'ay',
            'yas',
            'sevk_eden_hastane',
            'kabul_eden_hastane',
            'ekip',
            'transport',
            'sehir_disi',
            'tani',
            'tani_detay',
            'durum',
            'sonlandi',
            'entube',
            'anne_karninda',
            'askom',
            'aciklama',
            '_token'];

       $veriler=Patient::where(function($query) use($request,$whiteList){

            foreach($request->all() as $key=>$value){

                if(in_array($key,$whiteList)){

                $query->where($key,$value);

            }
            }})->get();
        

        return view('front.partials.arama.index',compact('veriler'));

çalışmadı sad

Çevrimdışı

#11 22.01.2019 13:25:15

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 394

Yanıt: Detaylı arama

@GkyKrkc at üstünden şu acemiliği artık ya.Çalışmadı deyip post atmak yakışmıyor artık sana.
Debug yap.kod sytanxında hata yok.


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#12 22.01.2019 13:48:16

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

@deathisonitsway üstat bitirdin beni varya, atamıyorum acemeliğimi ne yapayım debug yapmak nasıl bişey nasıl yapılıyor smile)  ingilizcem iyi degil, araştırma yapıyorum ama anladığım çıkmadı, bir iki input degerini aratıyorum ama böyle komplex olunca tıkandım, laravelde nasıl yapılıyor belki kolay yolu vardır diye soruyorum. yada tecrübelerinizden faydanalanıyorum , kodu yazarken mgsmus üstadım gibi comment ler ile açıklama yapılsa satır satır anlamlandırabiliriz belki, aslında bu sadece benim degil , emin ol yeni başlayan bir çok arkadaşımın sorunu,elin gavuruna udemy den para vermekten usandım smile bizimkilerde anlatmamış, e biz nasıl öğrenecez? bunlar size basit geliyor peki neden ? çünkü biliyorsunuz smile)) bilene kolay üstad ne yapayım işimiz zor hakkını helal et

Çevrimdışı

#13 22.01.2019 14:01:39

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 394

Yanıt: Detaylı arama

Orjinal kodunda whereBeetweenler var bak.. callback icinde bir atraksiyon yapacaksın keylere göre.Ben sana basic bir kullanım verdim.
callback icinde dd($key,$value); bastırarak where yapacaksın...


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#14 22.01.2019 15:49:14

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

bunun daha basit yöntemi yok mu ? yapamadım olmadı olmuyor

Çevrimdışı

#15 22.01.2019 18:19:27

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,500
Website

Yanıt: Detaylı arama

Öncelikle $whiteList dizisinden _token anahtarını çıkarın. Gördüğünüz gibi o csrf token, sizin bir işiniz yok.

$veriler = Patient::where(function($query) use ($request, $whiteList) {

    foreach($request->all() as $key => $value){

        if(in_array($key, $whiteList)){
            $query->where($key, 'LIKE', "%{$value}%");
        }

    }

})->get();

Çevrimdışı

#16 22.01.2019 22:28:12

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

mgsmus son yazdığın kod çalıştı ama burada ilginç bir durum var mesala il durumda hiç seçm yapmadığımda  veritabanından sadece il_durum=1 olan değerleri alıp geliyor. ikinci bir durum baslama ve bitiş tarihlerinin aralığını 1 gün yapınca bazı sonuçlar geliyor ama 15 gün yapınca bu tarih aralığında kayıtlar olmasına rağmen sonuç gelmiyor. sence neden olabilir.

return $veriler = Patient::where(function($query) use ($request, $whiteList) {
            $baslama_tarih = $request->baslama_tarih." 00:00:00";
            $bitis_tarih   = $request->bitis_tarih." 23:59:59";
            foreach($request->all() as $key => $value){

                if(in_array($key, $whiteList)){
                    $query->whereBetween('baslama_tarih', [$baslama_tarih, $bitis_tarih])
                        ->where($key, 'LIKE', "%{$value}%");
                }

            }

        })->get();

Çıktı

id: 88,
user_id: 1,
baslama_tarih: "2019-01-02 00:00:00",
bitis_tarih: "2019-01-02 23:59:59",
il_durum: 1,
sehir: 58,
kategori: "3",
basamak: "",
hasta_adi: "Azime KAVALA",
mernis_no: "xxxxxxxxxxx",
uyruk: "TC",
cinsiyet: "2",
gun: "",
hafta: "",
ay: "",
yas: "88",
sevk_eden_hastane: "1",
kabul_eden_hastane: "1",
ekip: "",
transport: 0,
sehir_disi: 0,
tani: "GÜS",
tani_detay: "ABY",
durum: "5",
sonlandi: "on",
entube: null,
anne_karninda: null,
askom: null,
aciklama: "",
_token: null,
created_at: "2019-01-16 12:27:18",
updated_at: "2019-01-16 12:27:18"

Son düzenleyen GkyKrkc (22.01.2019 22:29:18)

Çevrimdışı

#17 23.01.2019 00:18:46

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,500
Website

Yanıt: Detaylı arama

foreach içerisinde $value nin bir değeri olup olmadığını da kontrol ederek sadece değeri olanları işleme koyulmasını sağlayabilirsiniz ya da daha kısa olarak $request->all() yerine $request->filled() kullanabilirsiniz. $request->filled() sadece değer alan parametreleri içerir.

Çevrimdışı

#18 23.01.2019 08:15:47

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

versiyon hatası olduğunu düşünmüyorum ama  5.3 kullanıyorum $request->filled() yazınca şu hatayı verdi,

BadMethodCallException in Macroable.php line 74:
Method filled does not exist.

acaba whitelist den gelen key value anahtar değerleriyle mi uyuşmadı ?
biraz araştırma yaptım $request->filled('name') yazdım olmadı , $request->has() yaz diyenler olmuş yine olmadı aslında üstad seninde dediğin gibi  $request den gelen verileri sadece dolu olanları yakalayıp sorguya sokabilsek sanırım sorunu çözecez

Çevrimdışı

#19 23.01.2019 08:57:12

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,500
Website

Yanıt: Detaylı arama

Request::filled() 5.3'de yoktur. Siz foreach içerisinde $value değerini kontrol edin. En basitinden

if(in_array($key, $whiteList) && $value){
    $query->where($key, 'LIKE', "%{$value}%");
}

Burada önemli olan şu, örneğin bir parametrenin değeri 0 ise onu boş kabul edecektir. Siz özellikle 0 olan değerleri aramak isterseniz, ki ben karışıklık olmasın diye 0 değerini hiçbir zaman "değer almış" şeklinde kullanmam, özellikle kontrol edeceksiniz. $value === 0 gibi mesela. Ona özel işlem yaptıracaksınız.

Çevrimdışı

#20 23.01.2019 09:00:30

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 394

Yanıt: Detaylı arama

@gkykrkc biraz mantığını çalıştırsan çözeceksin olayı,kapatıyorsun kendini.
request()->all() ile değerler geliyor.elinde bir tane de whiteList in var yada @mgsmusun dedigi gibi requestin filled methodunu da alabilirsin ama senin form komplex.selectlerin felan var orada hepsi diye bir option da yapmıssındır sen.

Bana sorsan ben bu request taklalarını asla controllercüde yapmam.alırım tanımladıgım bir request objesine orada yapar burada kullanırım.hem kodum temiz kalmıs olur hemde istediğim şartları sağlamış şekilde bir request alırım.

senin kodun şöyle çalışabilir..

return $veriler = Patient::where(function($query) use ($request, $whiteList) {

            //whitelist den baslama tarihi ve bitis tarihini cıkarırsan olur boyle
            $query->where('baslama_tarihi','>',$request->baslama_tarihi);
            $query->where('bitis_tarihi','<',$request->bitis_tarihi);

             foreach($request->all() as $key => $value){

        if(in_array($key, $whiteList)){
            $query->where($key, 'LIKE', "%{$value}%");
        }

    }

        })->get();

gibi olacak..artık doluluk boslugu sen şarta bağla burada...

Son düzenleyen deathisonitsway (23.01.2019 09:01:10)


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#21 24.01.2019 19:31:57

GkyKrkc
Üye
Yer: Seyyah
Kayıtlı: 04.04.2017
Mesajlar: 236

Yanıt: Detaylı arama

mgsmus yazdı:

htarını çıkarın. Gördüğünüz gibi o csrf tok

Üstad versiyonu Laravel 5.7 ye yükselttim, return  $request->filled(); kodunu yazdığım zaman aşağıdaki hatayı alıyorum

Too few arguments to function Illuminate\Http\Request::filled(), 0 passed in C:\xampp\htdocs\L\Laravel\Kobis\app\Http\Controllers\SearchController.php on line 45 and exactly 1 expected

Çevrimdışı

#22 25.01.2019 00:40:09

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,500
Website

Yanıt: Detaylı arama

Benim hatam smile Parametre verilmez ise sadece dolu alanları, parametre verilirse parametre dolu mu değil mi onu dönderir şeklinde aklımda kalmış. Siz şöyle yapın:

// Sadece izin verilen ve dolu olan alanlar
$fields = array_filter($request->only(array_keys($whiteList)));

foreach($fields as $key => $value) {
    $query->where($key, 'LIKE', "%{$value}%");
}

if($request->filled('baslama_tarihi ')) {
    $query->where('baslama_tarihi','>=',$request->baslama_tarihi);
}

if ($request->filled('bitis_tarihi')) {
    $query->where('bitis_tarihi','<=',$request->bitis_tarihi);
} 

Çevrimdışı

Forum alt kısmı