2016-08-04 111 views
2

我有一個名爲Locins(位置)的表,它具有一個外鍵給名爲Rgn(區域)的另一個表。belongsTo關係返回null

所以在我的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

您的表Locin具有RgnID列和一個具有現有RgnID的記錄? –

+0

我的Locin表有很多記錄,並且存在RgnID,我確定測試的具有RgnID值爲35. –

+0

Rgn :: find($ location-> RgnID)是否返回一個Rgn記錄,或空值? – patricus

回答

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的值,您可以直接運行輸出t Ø看到你的數據庫,如果查詢正確

Select * from `Rgns` where `Rgns`.`RgnID` = 1 limit 1 
+0

謝謝!這聽起來非常有用。由於某種原因,它返回: ' array:3 [▼ 「query」=>「select * from'Rgns'其中'Rgns'.'RgnID' =?limit 1」 「bindings」=> array:1 [▼ 0 => 0 ] 「time」=> 3.19 ] ' 所以'''作爲RgnID。 –

+1

@AdamZahran'?'是一個參數佔位符。 'bindings'告訴你什麼值被注入到這些參數中。在Alfredo給出的例子中,'bindings'表示值'1'將被注入。在你顯示的輸出中,值「0」被注入。這意味着你測試的記錄的'Locins.RgnID'是0. – patricus

+0

你們是非常有幫助的。謝謝。 –

0

您已將每個關係的兩個關係列設置爲'RgnID'。我猜它應該是別的東西。

記住,它是:

return $this->belongsTo('App\Whatever', 'foreign_key', 'other_key'); 
+0

在'Locin'中有一個名爲RgnID的字段,它引用了Rgns表中的主鍵,它恰好也被稱爲RgnID。我希望你是對的,但事實並非如此。 –

+1

我希望這不會被認爲是粗魯的,因爲這絕對不是我的意圖,但是如果您對架構有所控制,並且這是您正在構建的新東西,那麼遵循適當的命名約定是值得的。爲您的模型命名爲'Location'和'Region',主鍵應該命名爲'id',並且'locations'表中的外鍵應該是'region_id'。那麼你不需要擔心這一切,你需要的只是型號名稱。 – user3158900

+0

我明白你來自哪裏。實際上我對這一切有着同樣的感受,但不幸的是,這是一個我正在開發的已經存在的項目,必須堅持預定義的數據庫命名。 –