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

Merhaba, gelen bir değere göre arama yapmak istiyorum.
Gelen değer articles, categories ve users tablolarında aransın. Articles'da varsa eğer zaten sonucu dönüyor. Diyelim ki articlesta bulamadı ama aynı anda categories de buldu. O kategoriye ait kayıtları getirsin. veya users tablosunda arama yapıp bulduysa o kişiye ait kayıtları getirsin. Tabi bunu yaparken hem o kategori, hem o kayıtlar, hem de o kayıtları ekleyen user aktif olsun. Böyle bir sorguyu nasıl yazabilirim.
Bu tablolar birbirleriyle bağlı.

sineld Teşekkürler, pakete bakacağım ama bunu paketsiz şekilde yapmak zor mu olur? Ya da mantıksız mı olur?

    bfdn Şöyle olabilir:

    $articles = Article::where(function($query) use ($search) {
            $query->where('title', 'like', "%$search%")
                ->orWhere('description', 'like', "%$search%");
        })->orWhereHas('category', function($query) use ($search) {
            $query->where('name', 'like', "%$search%");
        })->orWhereHas('user', function($query) use ($search) {
            $query->where('name', 'like', "%$search%");
        })
        ->simplePaginate();
    • bfdn bunu yanıtladı.
      • Bbfdn

          Seviye 2
        • Düzenlendi

        mgsmus Teşekkürler ancak tam olarak istediğim bu değil yani çözüm olmuyor.
        Bu sorguya join ile ekleme yaparak çözdüm. Articles, blog_categories, users üzerinde gelen datayı arama yaptırmak ve aktif olan kayıtları almak istedim. Örnek 'yeni' diye bir veri araması yaptığımda hem articles, hem kategorilerde, hem de users da arama yapıyor. Eşleşme sağlandığında aynı anda hem user, hem kategori hem de article aktif olmalı. Herhangi biri aktif olmazsa ilgili kayıtlar gelmemeli.
        join ekleyerek yaptım ancak belki daha mantıklı bir çözümü vardır.

        $articles = Article::query()
                    ->with(['category', 'user'])
                    ->select('articles.*')
                    ->leftJoin('blog_categories', 'blog_categories.id', '=', 'articles.blog_category_id')
                    ->leftJoin('users', 'users.id', '=', 'articles.user_id')
                    ->where(function ($query) use ($searchText, $locale) {
                        $query->where(function ($query) use ($searchText, $locale) {
                            $query
                                ->where("articles.name->{$locale}", "LIKE", "%$searchText")
                                ->orWhere("articles.slug->{$locale}", "LIKE", "%$searchText%")
                                ->orWhere("articles.content->{$locale}", "LIKE", "%$searchText%");
                        })->active('articles')->active('users')->active('blog_categories');
                    })->orWhereHas('category', function ($query) use ($searchText, $locale) {
                        $query->active('articles')->active('users')->active('blog_categories')
                            ->where("name->{$locale}", 'LIKE', '%' . $searchText . '%')
                            ->orWhere("slug->{$locale}", "LIKE", "%" . $searchText . "%")
                            ->orWhere("content->{$locale}", "LIKE", "%" . $searchText . "%");
                    })->orWhereHas('user', function ($query) use ($searchText) {
                        $query->active('articles')->active('users')->active('blog_categories')
                            ->where('users.name', 'LIKE', "%$searchText%");
                    })
                    ->orderByDesc('id')
                    ->paginate(10)
                    ->withQueryString();

        Ayrıca bu yukarıda önerilen paket tam olarak ne tarz sorgularda, ne tarz senaryolarda kullanmak mantıklı olur.

          bfdn

          $articles = Article
              // 1. grup mutlaka olması gereken şartlar
              ::where(function ($query) {
                  $query->where('is_active', true)
                      ->whereHas('category', function ($query) {
                          $query->where('is_active', true);
                      })->whereHas('user', function ($query) {
                          $query->where('is_active', true);
                      });
              })
              // 2. grup aramanın yapıldığı grup
              ->where(function ($query) use ($search) {
                  $query->where(function ($query) use ($search) {
                      $query->where('title', 'like', "%$search%")
                          ->orWhere('description', 'like', "%$search%");
                  })->orWhereHas('category', function ($query) use ($search) {
                      $query->where('name', 'like', "%$search%");
                  })->orWhereHas('user', function ($query) use ($search) {
                      $query->where('name', 'like', "%$search%");
                  });
              })
              ->simplePaginate();
          • bfdn bunu yanıtladı.

            mgsmus Tam olarak istediğim buydu, çok teşekkür ederim hocam. Problemi çözdü. Kodu inceleyip mantığını anlayayım.
            whereHas, orWhereHas tekrar tekrar kullanmak aklıma gelmemişti, tek bir yerde çözmeye çalıştığım için sıkıntı yaşadım sanırım.
            Ayrıca yukarıda önerilen paket ile ilgili bir bilginiz varsa hangi tür senaryolarda kullanılması mantıklı olur?

              bfdn Paketin yaptığı birden fazla model üzerinde arama yapıp sonuçları birleştirmesi. Mesela hem User hem de Article modelinde arama yaptınız, aradığınız kelimeye göre 3 User 5 Article buldu. Bunları birleştirip size modele göre sonuçları getirebileceğiniz bir şekilde sunuyor. Böyle bir ihtiyaç varsa kullanabilirsiniz ama arama işini bu kadar karıştırmaya gerek yok, en basit şekliyle çözün derim. Zaten ciddi bir arama söz konusu ise ElasticSearch gibi bu iş için uygun araçlar kullanılır.

              • bfdn bunu yanıtladı.

                mgsmus Ciddi bir arama söz konusu değil. Öyle bir durum olursa ElasticSearch detaylı bakarım. Yüzeysel ne olduğunu, ne yaptığını biliyorum ama hiç uygulamadım. Paketle ilgili de neye çözüm olduğuyla ilgili fikrim oldu. Tekrar teşekkürler hocam yardımlarınızdan dolayı.