我们有以下模型:问与答。
在答案表中,我们有一个布尔列,名称为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?
答案 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;