2016-12-29 138 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