我将直接从我的例子开始。问题是,我有几个hasMany
和belongsTo
关系,我想访问其中一个返回对象的属性作为where子句中的键。
假设我有一个名为Price
的模型,它与三个名为belongsTo
,profileSystem
和profileType
的模型有colorGroup
个连接。我的其他三个模型中的每个模型与hasMany
模型都有Price
个连接。
因此,如果我有profileType
模型的实例,我想称之为价格,因此profileSystem
和colorGroup
父母会有一定的价值。有效的例子:
App\ProfileType::find(1)
-> prices -> where('profileType', App\ProfileType::find(1))
-> where('colorGroup', App\ColorGroup::find(1))
-> first()->value;
如您所见,此处的比较直接适用于属于colorGroup
模型的profileType
和Price
模型的整个实例。我想做的是不比较整个模型,而只是一个属性,如:
->where('colorGroup->id', 1)
或
->where('colorGroup->id', App\ColorGroup::find(1) -> id)
问题是我在laravel中不常见的所有语法。我也在文档中找不到任何内容。提前谢谢!
答案 0 :(得分:1)
您可以对以下各项使用scopes:
class ColorGroup {
public function scopeColor($query, $color)
{
return $query->where('id', $color);
}
}
答案 1 :(得分:0)
如果您的价格属于colourGroup,则表示您的价格表中有某种外键“eg colour_group_id”。因此,你应该做一些像
这样的事情->where('colour_group_id', $acolourgroup->id)
如果它理解正确,你会得到你想要的东西
编辑:
您可以使用$ instance-> relation() - > getForeignKey();
访问关系外键所以我想做的是这样的范围:
public function scopeWhereRelationship($query, $r){
return $query->where($this->relationship()->getForeignKey(), $r->id);
}
但我不确定这是你想要的
编辑2:
您可以轻松概括我给您的范围。例如,您可以将范围添加到根模型(每个模型将扩展的类),并将关系的名称添加为参数。例如:
public function scopeWhereBelongsTo($query, $relationship, $instance)
{
$relationship = $this->{$relationship}();
return $query->where($relationship->getForeignKey(), $instance->getAttribute($relationship->getOwnerKey()));
}
现在,您可以在每个模型上使用您可以调用的范围:
Model::whereBelongsTo('thenameofyourrelationship', $theinstance);
一点点解释:
$this->{$relationship}()
这得到了关系,即代表关系的BelongsTo类。
使用$relationship->getForeignKey()
,您将获得外键的名称。
使用$relationship->getOwnerKey()
,您将获得所有者密钥的名称,即第二个表中使用的字段(模型所属的字段)。
使用$instance->getAttribute($relationship->getOwnerKey())
,您将获得所有者密钥的值。
答案 2 :(得分:0)
你知道,我实际需要的似乎是var arr = [2, 2, 2, 2, 2, 4, 5, 5, 5, 9];
function foo(arr) {
var a = [], b = [], prev;
arr.sort();
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i] !== prev ) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = arr[i];
}
return [a, b];
}
var result = foo(arr);
var a = result[0]
var b = result[1]
var aa=a.split(",");
var ab=b.split(",");
var a = a.split(",").length;
var b = b.split(",").length;
for (c = 0; c < a; c++){
console.log(aa[c]);
console.log(ab[c]);}
功能!
因此,而不是像whereHas
这样的思考建议,解决方案看起来像
->where('colorGroup->id', 1)