Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查询一对一关系的正确方法?(拉威尔7)_Php_Laravel_Eloquent - Fatal编程技术网

Php 查询一对一关系的正确方法?(拉威尔7)

Php 查询一对一关系的正确方法?(拉威尔7),php,laravel,eloquent,Php,Laravel,Eloquent,假设我有两个一对一的模型:Person和PhoneNumber 在人物模型上,我定义: public function phone() { return $this->hasOne('App\PhoneNumber'); } public function person() { return $this->belongsTo('App\Person'); } 在电话号码上,我定义: public function phone() { return $thi

假设我有两个一对一的模型:Person和PhoneNumber

在人物模型上,我定义:

public function phone() {
    return $this->hasOne('App\PhoneNumber');
}
public function person() {
    return $this->belongsTo('App\Person');
}
在电话号码上,我定义:

public function phone() {
    return $this->hasOne('App\PhoneNumber');
}
public function person() {
    return $this->belongsTo('App\Person');
}
这就是代码中一对一关系的定义

假设Person模型包含包含关于此人的信息的列,例如年龄。同时,电话号码可能包含诸如是手机还是固定电话等信息

使用Laravel最佳实践,编写一个选择所有65岁以上拥有手机的人的查询的正确方法是什么

我知道我可以这样做:

$results = Person::where('age', '>', 65)
             ->whereHas('phone_number', function($q) {
                 $q->where('type', 'cell');
             })->get(); 

然而,这只是一个简单的查询,没有利用hasOne/belongsTo关系。我的问题是,有没有更惯用、更简单的方法用Laravel编写相同的查询

您提供的代码已经在使用关系,因为您不必手动将表连接在一起,也不必指定外键是什么,虽然我不知道为什么您在
where has
方法中将关系写为
phone\u number
,而不是按照上面的关系定义代码写为
phone
。应该是:

$results = Person::where('age', '>', 65)
             ->whereHas('phone', function($q) {
                 $q->where('type', 'cell');
             })->get(); 
我确实认为,一般来说,可以在数据库中完成的任何类型的过滤都应该在数据库中完成,否则,如果您希望在php端完成,您可以这样做:

$results = Person::with('phone')->get()
             ->filter(function($p){
                 return $p->age > 65 && ($p->phone->type ?? '') === 'cell';
             });

whereHas
确实利用了关系的存在,这就是为什么它需要实际匹配您命名的关系,在您的情况下,它应该是
whereHas('phone'…
我不确定我是否理解问题的真正含义谢谢,我对
哪里有
的工作原理感到困惑。你的评论和另一个评论为我澄清了这一点。出于某种原因,我认为它必须采用表名,不需要现有的关系(例如,我认为您仍然可以在Laravel之外使用whereHas with
$database::table(“某物”)
?在没有涉及模型的情况下?)谢谢。您能否澄清“可以在数据库中进行的任何类型的筛选都应该在数据库中进行?”是相关的吗?这就是whereHas正在做的,对吗?我想不出过滤器()方式会是什么情况preferred@cheryllium是的,我只是暗示我修改的代码通常对您来说是更好的选择,因为数据库中的筛选更优化。例如,查询后的
filter()
比查询中的筛选慢