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

2022-08-30 21:13:55

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

我目前有以下几点:

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


答案 1

好吧,我所做的只是向我的模型添加新属性,然后将我的条件添加到该attirbute中,只需执行此操作即可。

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....
     }
 }

答案 2

您只需创建一个作用域,然后在必要时将其添加到生成器实例。

例:

用户.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 文档中阅读有关范围的更多信息。


推荐