访问对象的属性作为laravel中where子句中的键

时间:2017-04-17 14:51:27

标签: php laravel laravel-5.3

我将直接从我的例子开始。问题是,我有几个hasManybelongsTo关系,我想访问其中一个返回对象的属性作为where子句中的键。 假设我有一个名为Price的模型,它与三个名为belongsToprofileSystemprofileType的模型有colorGroup个连接。我的其他三个模型中的每个模型与hasMany模型都有Price个连接。 因此,如果我有profileType模型的实例,我想称之为价格,因此profileSystemcolorGroup父母会有一定的价值。有效的例子:

App\ProfileType::find(1) 
                -> prices -> where('profileType', App\ProfileType::find(1))
                -> where('colorGroup', App\ColorGroup::find(1))
                -> first()->value;

如您所见,此处的比较直接适用于属于colorGroup模型的profileTypePrice模型的整个实例。我想做的是不比较整个模型,而只是一个属性,如:

->where('colorGroup->id', 1)

->where('colorGroup->id', App\ColorGroup::find(1) -> id)

问题是我在laravel中不常见的所有语法。我也在文档中找不到任何内容。提前谢谢!

3 个答案:

答案 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)