Laravel:将参数传递给关系函数


Laravel: Pass Parameter to Relationship Function?

是否可以以某种方式将参数传递给关系函数?

我目前有以下内容:

public function achievements()
{
     return $this->belongsToMany('Achievable', 'user_achievements')->withPivot('value', 'unlocked_at')->orderBy('pivot_unlocked_at', 'desc');
}

问题是,在某些情况下,它不会获取unlocked_at列,并返回一个错误。

我试过做一些类似的事情:

public function achievements($orderBy = true)
{
$result = $this->belongsToMany (...)
if($orderBy) return $result->orderBy(...)
return $result;
}

并称之为:

$member->achievements(false)->(...)

但这并不奏效。有没有办法将参数传递到该函数中,或者有没有办法检查是否正在使用pivot_unlocked_at

我所做的只是向我的模型添加新的属性,然后将我的条件添加到该数组中,简单地做到了这一点。

Class Foo extends Eloquent {
    protected $strSlug;
    public function Relations(){
         return $this->belongsTo('Relation','relation_id')->whereSlug($this->strSlug);
    }
 }
 Class FooController extends BaseController {
     private $objFoo;

     public function __construct(Foo $foo){
         $this->objFoo = $foo
     }
     public function getPage($strSlug){
        $this->objFoo->strSlug = $strSlug;
        $arrData = Foo::with('Relations')->get();
        //some other stuff,page render,etc....
     }
 }

您可以简单地创建一个范围,然后在必要时将其添加到构建器实例中。

示例:

用户.php

public function achievements()
{
    return $this->hasMany(Achievement::class);
}

实现.php

public function scopeOrdered(Builder $builder)
{
    return $builder->orderBy(conditions);
}

然后在使用时:

//returns unordered collection
$user->achievements()->get();
//returns ordered collection
$user->achievements()->ordered()->get();

您可以在Eloquent文档中阅读更多关于作用域的信息。

您可以做更简单、更安全的事情:

当您使用parentesis调用关系函数时,Laravel将只返回查询,您需要添加get()或first()来检索结果

public function achievements($orderBy = true)
{
if($orderBy) 
    $this->belongsToMany(...)->orderBy(...)->get();
else
    return $this->belongsToMany(...)->get();
}

然后你可以这样称呼它:

$member->achievements(false);

适用于最新版本的Laravel。

必须解决这个问题,另一个是像在Laravel 5.3上一样,没有其他解决方案对我有效

实例化模型:

$foo = new Foo();

设置新属性

$foo->setAttribute('orderBy',true);

然后在查询数据时使用setModel方法

Foo::setModel($foo)->where(...)

这将使您从关系方法中访问所有属性

public function achievements()
{
if($this->orderBy) 
    $this->belongsToMany(...)->orderBy(...)->get();
else
    return $this->belongsToMany(...)->get();
}