我有一个名为Locins
(位置)的表,它有一个外键到另一个名为Rgn
(区域)的表。
所以在我的Locin模型中:
class Locin extends Model
{
protected $table = 'Locin';
protected $primaryKey = 'Locin_id';
public $timestamps = false;
public function Rgn()
{
return $this->belongsTo('App\Models\Rgn', 'RgnID', 'RgnID');
}
}
在我的Rgn模型中:
class Rgn extends Model
{
protected $table = 'Rgns';
protected $primaryKey = 'RgnID';
public $timestamps = false;
public function Locin()
{
return $this->hasOne('App\Models\Locin', 'RgnID', 'RgnID');
}
}
当我说:$location = Locin::find($request->Locin);
时,会成功返回一个位置。 (我var_dumped它。)
但是当我说$location->Rgn
时,它会返回null。
表格结构:
Locins表:[Locin_id(主键),RgnID(外键),其他不相关的字段]。
Rgns表:[RgnID(主键),其他不相关的字段]
我做错了什么?
修改 事实证明,DB中的愚蠢种子有一个不存在的条目的外键。 我厌倦了陷入愚蠢的事情。对不起,祝你有个美好的一天。
答案 0 :(得分:1)
您可以看到该区域正在运行的查询,它是一种测试流程的方式:
\DB::connection()->enableQueryLog();
$location = Locin::find(1);
$region = $location->Rgn;
$query = \DB::getQueryLog();
$lastQuery = end($query);
dd($lastQuery);
你得到这样的东西
array:3 [
"query" => "select * from `Rgns` where `Rgns`.`RgnID` = ? limit 1"
"bindings" => array:1 [▼
0 => 1
]
"time" => 0.5
]
在查询中替换bindings
的值,您可以直接将输出运行到数据库以查看查询是否正确
Select * from `Rgns` where `Rgns`.`RgnID` = 1 limit 1
答案 1 :(得分:0)
您已为每个关系将两个关系列都设置为“RgnID”。我猜它应该是别的东西。
记住它是:
# Code name as a factor so that drop=FALSE will work
testdt$name = factor(testdt$name)
ggplot(data = testdt, aes(x = x, y = value)) +
geom_line(data = testdt[group == 1], aes(colour = name)) +
geom_bar(data = testdt[group == 2], aes(fill = name), stat = "identity", show.legend=FALSE) +
scale_color_manual(values=rep(hcl(c(15,195),100,65),each=2), drop=FALSE) +
scale_fill_manual(values=rep(hcl(c(15,195),100,65),each=2), drop=FALSE) +
guides(color=guide_legend(override.aes=list(size=c(1,7,1,7))))
答案 2 :(得分:0)
如果您按位置模型提取区域,则应使用此
来使用相关模型的预先加载(https://laravel.com/docs/5.2/eloquent-relationships#eager-loading)$location = Locin::where('Locin_id', $request->Locin)->with('Rgn')->get();
希望这有助于您找到一个非常快速的解决方案。