Jackksparrow Daha önce de aynı yolu izlemiştiniz, yanlış yapıyorsunuz. Bunun için pivot tablo kullanın. 8 id'li kategori giderse ne olacak? Tüm kullanıcıları tarayıp category sütununda 8 geçen tüm kullanıcıları güncelleyecek misiniz? Yoksa her seferinde kategori var mı diye kontrol mu edeceksiniz? RDMBS veritabanı (MySQL, MariaDB, PostgreSQL, SQL Server, Oracle) kullanıyorsanız veri normalizasyonuna dikkat etmeniz lazım, kayıtlar (bilinçli yapmıyorsanız) öksüz kalmamalı.
Bir tane user_category isimli tablo oluşturun. Bu sizin pivot tablonuz, User ile Category arasındaki ilişkiyi tutacak:
Schema::create('user_category', function (Blueprint $table) {
$table->foreignId('user_id')->constrained('users')->onDeleteCascade();
$table->foreignId('category_id')->constrained('categories')->onDeleteCascade();
$table->unique(['user_id', 'category_id']);
});
User ile Category modeli arasında many-to-many dediğimiz BelongsToMany ilişkisi kurun:
app/Models/User.php:
public function categories(): BelongsToMany
{
return $this->belongsToMany(Category::class, 'user_category', 'user_id', 'category_id');
}
app/Models/Category.php:
public function users(): BelongsToMany
{
return $this->belongsToMany(User::class, 'user_category', 'category_id', 'user_id');
}
Şimdi artık şöyle yapabilirsiniz:
$category = Category::find(1);
// Kategoriye ait kullanıcılar
$users = $category->users;
// Örneğin
$users = $category
->users()
->where('name', 'like', "%{$search}%")
->paginate();
ya da
$categoryId = 1;
$users = User::whereHas('categories', function($query) use ($categoryId) {
$query->where('id', $categoryId);
})
->get();
Kullanıcıdan yola çıkarsanız:
$user = User::find(1);
// Kullanıcının kategorileri
$categories = $user->categories;
// Örneğin
$user->categories->pluck('name'); // ['Oyun', 'Kitap', 'Spor']
ya da
$userId= 1;
$users = Category::whereHas('users', function($query) use ($userId) {
$query->where('id', $userId);
})
->get();
https://laravel.com/docs/8.x/eloquent-relationships
Bu tür ilişkilerde kayıt ekleme, çıkarma vs işlemler için:
https://laravel.com/docs/8.x/eloquent-relationships#updating-many-to-many-relationships
Şu an sizin kullandığınız hali ile category alanının jsonb sütun olması lazım ve şöyle yapmanız lazım:
$categoryId = 1;
$users = User::whereHas('userInfo', function($query) use ($categoryId) {
$query->whereJsonContains('category', $categoryId);
})
->get();
ama dediğim gibi bu yapıda normalizasyon problemi var. Bunun dışında indexleme problemleri, kompleks sorgular, json ile cebelleşme...