belongsTo relationship返回null

时间:2016-08-04 13:50:20

标签: php laravel laravel-5 eloquent laravel-5.2

我有一个名为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中的愚蠢种子有一个不存在的条目的外键。 我厌倦了陷入愚蠢的事情。对不起,祝你有个美好的一天。

3 个答案:

答案 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();

希望这有助于您找到一个非常快速的解决方案。