Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhaba ,

laravel 8 kullanıyorum ve aşağıdaki gibi bir sorgum var ,

$addresses = DB::table('addresses')->where('user_id',$user->id)->where('active_passive',1)->get();

bu sorgudan beklentim user_id sütununun gelen $user->id ile eşleşerek bana doğru verileri sunması. Ancak böyle olmuyor.

user_id sütunu varchar olarak veri tabanında saklanıyor. ve bazı user_id değerleri 3,4,5 gibi sayısal değerler olabileceği gibi bazı user_id değerleri ise 16 karakterden oluşan random değerler oluyor.

burada sorun şurada oluşuyor. örneğin user_id değeri 4 olan bir kullanıcı olsun ve benim adres tablomda user_id değeri 4 olan bir satır olsun bunun yanıda ise user_id değeri '4pdAeealiZ1flMuVu5OF' şeklinde olan bir satır daha olsun. maalesef '4pdAeealiZ1flMuVu5OF' bu satırı da getiriyor. hatta user_id değeri 4 ile başlayan tüm satırları getiriyor. where koşulunda araya '=' de koydum ama yine de olmuyor. Sorun tam olarak nedir ? Düzeltmeyi nasıl yapabilirim ? Çok acil bir konu oldu benim için. Çünkü halihazırda çalışan bir web sitesinde bu sorunu tesadüfen fark ettim. Şimdiden teşekkür ederim.

    caglar_kocak Acı bir tecrübe yaşayarak sebebini buldum. $user->id değeri int. bir değer olarak geldiği için veri tablosundaki string ifade de bir sayı ile başladığında onu da int ifadeye çeviriyor ve doğal olarak yanlış eşleşme veriyor. Tek tek kodlarımı kontrol ederek her şeyi düzelttim. Çok zaman aldı maalesef.

      caglar_kocak Modele

      public $incrementing = false;
      protected $keyType = 'string';

      ekleyerek string primary key kullanmasını sağlayabilirsiniz. Elbette geçerli bir sebebiniz yoksa int kullanmak en mantıklısıdr. Kullanıcıların farklı bir id'leri varsa onlar ayrı bir sütunda tutulur, tablonun primary key değeri ellenmez ve onunla ilişki kurulur.

        mgsmus Model üzerinden sorgular yazmadığım için oradan değiştirmem işe yaramaz diye düşünmüştüm. Yarar mı ?

        user_id , users tablosu için int ve otomatik artarak devam ediyor ama kullanıcı girişi yapmadan alış veriş yapan kişileri tanımak için bazı tablolarda user_id değeri uniq olacak şekilde belirli string değerlerle ifade ediliyor. Örneğin alış veriş yapan kişinin adres bilgisi ya da sipariş bilgisi gibi veriler bu tarz id ler üzerinden takip ediliyor. Hayatımda ilk defa böyle saçma bir şeyle karşılaştım. Yani veri tabanındaki tür neyse ilk önce ona göre eşit mi değil mi diye bakmalı. Sorguda int veri gönderdim diye veri tabanındaki varchar veriyi int olarak algılaması çok saçma bir durum değil mi ?

          caglar_kocak Eğer $user bir model ise ve id bir auto increment primary key ise $user->id yaptığınızda onu Eloquent int olarak çeviriyordur. Veri tabanı o şekilde bir çeviri yapmaz. Veri tabanının yaptığı çeviri, varchar alana tamsayı (int) girmeye çalıştığınızda onu karakter ifadeye (string) çevirmekten ibaret.

            mgsmus veri tabanında 4ppxllspfpfkgkaa gibi bir veri varchar olarak tutuluyor. ben ise sorgudan 4 değerini gönderiyorum ve eşit mi değil mi diye kontrol ediyorum. sonuç olarak bana eşit diyor. Bu doğru bir şey mi ? Bunun olamaması lazım. int 4 göderirim ve varchar da sadece 4 tutuluyordur ve bana eşit der , bunu anlarım. Fakat 4 ifadesinin 4 ile başlayan ve peşinden harfler gelen tüm ifadelere eşit olması garip bir durum değil mi ?

              caglar_kocak Siz veri tabanına string alanda int ara şeklinde sorgu yazmışsınız. Benim anlatmak istediğim, veri tabanı sizin verdiğiniz değeri, baktığı sütun varchar diye stringe dönüştürmez. Siz dönüştürüp vereceksiniz. Siz int verdiğiniz için o da sütunu int'e çevirip sorgu yapmaya çalışıyor. Yani where('user_id',(string)$user->id) şeklinde vereceksiniz. Şu ikisi farkı sonuç verir:

              SELECT * FROM users WHERE user_id = 4;
              SELECT * FROM users WHERE user_id = '4'; --- Sizin istediğiniz sorgu bu

              mgsmus Veri tabanı o şekilde bir çeviri yapmaz.

              derken demek istediğim buydu.

              Eğer $user bir modelse ve id auto increment primary key ise benim verdiğim düzenlemeyi yaparsanız (string)$user->id yapmanıza gerek kalmaz, $user->id otomatik string olarak gelir ama user_id alanları primary keyler ve başka şeylerle karışık oluşmuş ise, User modelinin primary key'i auto increment olmak zorunda ise mecbur (string)$user->id yapacaksınız.

                mgsmus evet böyleymiş. Benim tecrübesiz yazılımcıyım. Dahası yazılımcı değilim. Bunu bilmiyordum öğrenmiş oldum. Sadece bu durum bana mantıksız geliyor. örnek verecek olursam ,

                if('4'=='4xxxx'){
                     // buraya giriş yapmaz.
                 }

                aynı davranışı veri tabanı sorgusunda da beklerdim. Ama öyle değilmiş.