2016-12-29 150 views
2

給定兩個表請求的每一個方面的工作:Laravel:關係不

Package 
-------- 
int id 
int parcel_id 
int order_id 
timestamps() 

Order 
-------- 
int id 
int user_id 
int search_id 
timestamp shipping_date 
timestamps() 

有屬於一個Order一個或多個Package對象,

分別,一個Order對象有一個或許多Package對象。

封裝模式:

public function order() { 
    return $this->belongsTo('App\Order'); 
} 
public function parcel() { 
    return $this->belongsTo('App\Parcel'); 
} 

訂貨型號:

public function search() { 
    $this->belongsTo('App\Search'); 
} 
public function user() { 
    $this->belongsTo('App\User'); 
} 
public function packages() { 
    $this->hasMany('App\Package'); 
} 

問:

我成功拿到PackageOrder,但我不能得到PackagesOrder相關聯。這是爲什麼 ?

我確實有相同的行爲,從用戶這一次,找到所屬的搜索。

當我嘗試找到Search-> user時,搜索正常工作。

我有User的has_many Adresses完全相同的模型結構,並Address屬於User,這兩種方式效果很好。

我的猜測是,這是因爲涉及到這兩個表很多鍵,但我還是給列名到通過belongsTo /的hasMany屬性和如果我沒有記錯,雄辯的關係是建立在列名和表名,而不是「真正的」MySQL關係(外鍵等)。

插圖在PHP工匠修補匠:

>>> $package = App\Package::where('id', 224)->first() 
=> App\Package {#800 
    id: 224, 
    parcel_id: 2, 
    weight: 10, 
    created_at: "2016-12-29 14:00:58", 
    updated_at: "2016-12-29 14:00:58", 
    order_id: 115, 
    } 
>>> $package->order 
=> App\Order {#743 
    id: 115, 
    user_id: 1, 
    search_id: 1, 
    created_at: "2016-12-29 14:00:58", 
    updated_at: "2016-12-29 14:00:58", 
    shipping_date: "2016-12-29 14:00:58", 
    } 
>>> $order = App\Order::where('id', 115)->first() 
=> App\Order {#804 
    id: 115, 
    user_id: 1, 
    search_id: 1, 
    created_at: "2016-12-29 14:00:58", 
    updated_at: "2016-12-29 14:00:58", 
    shipping_date: "2016-12-29 14:00:58", 
    } 
>>> $order->packages 
LogicException with message 'Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation' 
>>> $order->packages() 
=> null 
+0

好的,沒有'return'關鍵字。我的不好,問題解決了。 – tomsihap

回答

3

你缺少你的訂貨型號return語句。

public function search() { 
    return $this->belongsTo('App\Search'); 
} 
public function user() { 
    return $this->belongsTo('App\User'); 
} 
public function packages() { 
    return $this->hasMany('App\Package'); 
} 

您正在退回void這不是laravel關係。 ;)

+0

非常感謝您的回答。在閱讀過類似的問題之後,我確信自己沒有錯過......在閱讀我的SO帖子時,它發生在我身上!處理很多類似的文件有時會在沒有足夠的咖啡因的情況下被壓倒。 – tomsihap