Laravel 5.6 根据子行过滤父行
Laravel 5.6 filter parent rows based on children
我的数据库结构如下所示(我正在使用 MySQL):
产品:
#------#---------#
| id | int |
#------#---------#
| name | varchar |
#------#---------#
products_properties:
#-------------#-----#
| product_id | int |
#-------------#-----#
| property_id | int |
#-------------#-----#
属性:
#-------#---------#
| id | int |
#-------#---------#
| name | varchar |
#-------#---------#
| value | varchar |
#-------#---------#
是否可以根据属性筛选产品对象?我正在尝试像这样使用预加载:
$products = Product::with(['properties' => function($query){
$query->where('name', 'testproperty');
}])
->get();
但是当 运行 时,此代码 eloquent 仅过滤每个产品中找到的属性,即使没有属性与我的位置匹配,它仍然会找到所有产品。当我想显示我的所有属性时,eloquent 也会过滤我产品中的属性。
我现在的结果是这样的:
{
id: 1,
name: "test",
properties: [
{
id: 1,
name: "testproperty",
value: "testvalue"
}
]
},
{
id: 2,
name: "test2",
properties: [
]
}
但我正在寻找这样的东西:
{
id: 1,
name: "test",
properties: [
{
id: 1,
name: "testproperty",
value: "testvalue"
},
{
id: 2,
name: "testproperty2",
value: "testvalue2"
}
]
}
}
是否可以仅根据子对象(属性)过滤父对象 class 并仍然获得与产品关联的所有属性?
我猜你需要whereHas
来检查子集合
$product = Product::with('properties')
->whereHas('properties', function ($query) {
$query->where('name', '=', 'testproperty');
})->where('id', $id)->first();
我的数据库结构如下所示(我正在使用 MySQL):
产品:
#------#---------#
| id | int |
#------#---------#
| name | varchar |
#------#---------#
products_properties:
#-------------#-----#
| product_id | int |
#-------------#-----#
| property_id | int |
#-------------#-----#
属性:
#-------#---------#
| id | int |
#-------#---------#
| name | varchar |
#-------#---------#
| value | varchar |
#-------#---------#
是否可以根据属性筛选产品对象?我正在尝试像这样使用预加载:
$products = Product::with(['properties' => function($query){
$query->where('name', 'testproperty');
}])
->get();
但是当 运行 时,此代码 eloquent 仅过滤每个产品中找到的属性,即使没有属性与我的位置匹配,它仍然会找到所有产品。当我想显示我的所有属性时,eloquent 也会过滤我产品中的属性。
我现在的结果是这样的:
{
id: 1,
name: "test",
properties: [
{
id: 1,
name: "testproperty",
value: "testvalue"
}
]
},
{
id: 2,
name: "test2",
properties: [
]
}
但我正在寻找这样的东西:
{
id: 1,
name: "test",
properties: [
{
id: 1,
name: "testproperty",
value: "testvalue"
},
{
id: 2,
name: "testproperty2",
value: "testvalue2"
}
]
}
}
是否可以仅根据子对象(属性)过滤父对象 class 并仍然获得与产品关联的所有属性?
我猜你需要whereHas
来检查子集合
$product = Product::with('properties')
->whereHas('properties', function ($query) {
$query->where('name', '=', 'testproperty');
})->where('id', $id)->first();