如何获得修改的关系laravel

时间:2018-10-08 14:12:28

标签: laravel laravel-5 laravel-5.6

我们有以下模型:问与答。

在答案表中,我们有一个布尔列,名称为accepted,只有一个已接受的答案。我们想获得其答案的问题,并分别接受答案。

我使用两种方法,但是我不知道哪种更好:

1)。如果已加载过滤器关系,则检查该关系是否已加载,并获得如下所示的可接受答案:

if(!$this->relationLoaded('answers')){
            $this->load('answers');
        }
        return $this->answers->firstWhere('accepted',true);

2)。我们也可以使用这种方法:

function accepted_answer(){
  return $this->answer()->where('accepted',true);
}

第二种方法的问题是我们得到一个数组,但是我们期望一个响应或为null。 有没有更好的方法或者我们不能使用1或2?

3 个答案:

答案 0 :(得分:1)

Accessor模型上创建一个Question

class Question extends Model
{
    public function getSelectedAnswerAttribute()
    {
        return $this->answers->where('accepted', true)->first();
    }
}

现在在每个Answer实例中都有一个名为selected_answer的属性。

您可以像访问它一样

$answer->selected_answer;

注意

此“ selected_answer”不是从数据库中获取,而是从已获取的答案列表中进行过滤。因此它比第二种方法更有效。

,并且,如果希望此属性始终自动绑定到Question模型。将此accessor添加到appends数组中。

模型

protected $appends = ['selected_answer'];

答案 1 :(得分:0)

您应该采用 second 方法,因为以后如果发生某些更改(而不是挖掘大量的控制器),您将只有一个来源可以更改

要获取结果,请在构建器查询末尾使用program ex; uses Windows, // for constant SW_NORMAL ShellApi; // for function ShellExecute procedure exe; var che: string; begin writeln('ecrire ch'); readln(che); if ch ='oui' then begin ShellExecute(0, 'open', 'C:\TPW\exercice\project\site.html', nil, nil, SW_NORMAL); end; end; begin exe; end.

P.S:Scopes通常总是比在控制器内部手动编写查询要好

答案 2 :(得分:0)

在您的accepted模型中创建answer范围。

public function scopeAccepted($query){
   return $query->where("accepted",true)->first();
}

然后,您可以轻松检索第一个接受的答案。

$question->answer()->accepted();

进一步了解query scopes;