Laravel Eloquent 多个表的关系问题
Laravel Eloquent relation issue for multiple tables
在 Laravel 5.5 中,我尝试创建一个小应用程序来管理几个 sellers/stores 的产品。
因此,我有四个不同的模型是这样的:
Seller.php
class Attribute extends Model
{
public function items()
{
return $this->belongsToMany(Item::class);
}
}
Item.php
class Item extends Model
{
public function seller()
{
return $this->belongsTo(Seller::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
public function attributes()
{
return $this->belongsToMany(Item::class);
}
}
Category.php
class Category extends Model
{
public function items()
{
return $this->hasMany(Item::class);
}
}
Attribute.php
class Attribute extends Model
{
public function items()
{
return $this->belongsToMany(Item::class);
}
}
对于属性和项目之间的多对多关系,我创建了一个枢轴table:
Schema::create('attribute_item', function (Blueprint $table) {
$table->integer('attribute_id')->unsigned()->index();
$table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');
$table->integer('item_id')->unsigned()->index();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->primary(['attribute_id', 'item_id']);
});
整个应用程序的目标是:
- 通过属性(用于过滤或其他)按类别获取卖家的所有项目
- 获取卖家的特定商品并获取其属性和类别
我对 Laravel 的关系方法以及在这种情况下使用哪种方法感到有点困惑。
hasManyThrough
或多态关系更好吗?
我不得不承认我的逻辑有点问题。希望你能帮助我。
谢谢!
您可以使用 whereHas
方法来查找嵌套关系 让我们以您的第一个目标为例
通过属性(用于过滤或其他)按类别从卖家处获取所有商品
你可以这样写:
$items = Item::whereHas('seller.items', function ($query) {
$query->whereHas('categories', function ($categories) {
$categories->where('name', '=', 'Mens');
})
->orWhereHas('attributes', function ($attributes) {
$attriutes->where('size', '=', 'large');
});
})->get();
了解更多信息:https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence
这将为您提供项目列表,如果您想获取具有类别和属性的项目,您可以使用 with
方法获取关系数据:
$items = Item::whereHas('seller.items', function ($query) {
$query->whereHas('categories', function ($caegories) {
$categories->where('name', '=', 'Mens');
})
->orWhereHas('attributes', function ($attributes) {
$atributes->where('size', '=', 'large');
});
})
->with('categories', 'attributes')
->get();
希望这能指导您解决所面临的问题。
在 Laravel 5.5 中,我尝试创建一个小应用程序来管理几个 sellers/stores 的产品。
因此,我有四个不同的模型是这样的:
Seller.php
class Attribute extends Model
{
public function items()
{
return $this->belongsToMany(Item::class);
}
}
Item.php
class Item extends Model
{
public function seller()
{
return $this->belongsTo(Seller::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
public function attributes()
{
return $this->belongsToMany(Item::class);
}
}
Category.php
class Category extends Model
{
public function items()
{
return $this->hasMany(Item::class);
}
}
Attribute.php
class Attribute extends Model
{
public function items()
{
return $this->belongsToMany(Item::class);
}
}
对于属性和项目之间的多对多关系,我创建了一个枢轴table:
Schema::create('attribute_item', function (Blueprint $table) {
$table->integer('attribute_id')->unsigned()->index();
$table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');
$table->integer('item_id')->unsigned()->index();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->primary(['attribute_id', 'item_id']);
});
整个应用程序的目标是:
- 通过属性(用于过滤或其他)按类别获取卖家的所有项目
- 获取卖家的特定商品并获取其属性和类别
我对 Laravel 的关系方法以及在这种情况下使用哪种方法感到有点困惑。
hasManyThrough
或多态关系更好吗?
我不得不承认我的逻辑有点问题。希望你能帮助我。
谢谢!
您可以使用 whereHas
方法来查找嵌套关系 让我们以您的第一个目标为例
通过属性(用于过滤或其他)按类别从卖家处获取所有商品
你可以这样写:
$items = Item::whereHas('seller.items', function ($query) {
$query->whereHas('categories', function ($categories) {
$categories->where('name', '=', 'Mens');
})
->orWhereHas('attributes', function ($attributes) {
$attriutes->where('size', '=', 'large');
});
})->get();
了解更多信息:https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence
这将为您提供项目列表,如果您想获取具有类别和属性的项目,您可以使用 with
方法获取关系数据:
$items = Item::whereHas('seller.items', function ($query) {
$query->whereHas('categories', function ($caegories) {
$categories->where('name', '=', 'Mens');
})
->orWhereHas('attributes', function ($attributes) {
$atributes->where('size', '=', 'large');
});
})
->with('categories', 'attributes')
->get();
希望这能指导您解决所面临的问题。