как получить нужный столбец из другой таблицы

#php #mysql #laravel #laravel-8

#php #mysql #laravel #laravel-8

Вопрос:

есть две таблицы products и categories, которые я создал с помощью phpMyAdmin. В таблице products у него есть столбец с именем prd_category, который имеет внешний ключ категорий таблицы с именем cat_id (первичный ключ таблицы категорий).

я совсем новичок в laravel, я хочу вернуть все данные из таблицы продуктов с именем категории (cat_name) из другой таблицы

// вот мой контроллер

 use AppModelsproduct;

class items extends Controller
{
    public function sample(){ 
        return product::all();
    }
}
  

//маршрут

 Route::get('/',[items::class,'sample']);
  

//модель для таблицы продуктов

 class product extends Model
{
    use HasFactory;

    function category(){
        return $this->hasOne('AppModelscategory','cat_id','prd_id');
        
    }
}
  

//модель для категории

 class category extends Model
{
    protected $table='categories';
    use HasFactory;

}
  

пожалуйста, помогите и заранее спасибо..

Ответ №1:

вы можете использовать этот код:

 $products = product::whereHas('category',function($q)use($cat_name){
    $q->where('name',$cat_name)
})->get();
  

или :

 $categories = Category::where('name',$cat_name)->get()->pluck('id')->toArray()

$products = product::whereIn('category_id',$categories)->get();
  

Ответ №2:

Вы уверены, что отношение «один ко многим» правильное? Если продукт может принадлежать ко многим категориям, вам нужно использовать отношения «многие ко многим». Кроме того, если что-то еще принадлежит категориям, вы должны использовать полиморфные отношения «многие ко многим». Но давайте перейдем к принципу «один ко многим».

Во-первых, функция отношения в Product.php выглядит неправильно. Я думаю, что продукты должны принадлежать к категории.

 function category(){
   return $this->belongsTo('AppModelsCategory','cust_name','name');     
}
  

Затем вам нужно определить обратное отношение в Category.php

 function products(){
   return $this->hasMany('AppModelsProduct','cust_name','name');     
}
  

Когда вы правильно определяете отношения, все, что вам нужно сделать, это получить данные в контроллере:

 use AppModelsCategory
...
Category::with('products')->get();
  

Ответ №3:

 you can use relationship with forign key like pro_id

function category(){
   return $this->belongsTo('AppModelsCategory','pro_id');     
}

function products(){
   return $this->hasMany('AppModelsProduct','id');     
}

$cat = Category::with('products')->all();
  

в блейде :

 {{ $cat->products->cat_name; }}