簡體   English   中英

兩個相同模型/表之間的兩個關系

[英]Two relationships between two same models/tables

問題

您好,我在嘗試使兩個模型(Laravel 5.5)之間建立兩個關系時遇到麻煩: OrderUser

1 -----米| User (作為客戶)可以發出多個Order
1 -----米| User (作為員工)可以接受多個Order

因此,在我的orders表中,我將user_idemployee_id作為外鍵。

現在,某些訂單沒有初始的employee_id因為需要接受訂單,然后設置該值。

使用修補匠,我找到了這個Order對象(id:30),它有一個user_id和一個employee_id但是當我dd()時,它返回:

=> App\Models\Order {#882
     order_id: 30,
     user_id: 7,  // <-- foreign key
     employee_id: 6,  // <-- foreign key
     restaurant_id: 4,  // <-- foreign key (for other table)
     // ...
     total: "120.00",
     created_at: "2018-01-31 00:15:41",
     updated_at: "2018-01-31 00:15:41",
     deleted_at: null,
     restaurant: App\Models\Restaurant {#900 // <- MY RESTAURANT RELATION (M-1)
       restaurant_id: 4,
       name: "Stark, Padberg and Buckridge",
       // ...
       // ...
       created_at: "2018-01-12 18:18:17",
       updated_at: "2018-01-12 18:18:17",
       deleted_at: null,
     },
     customer: App\Models\User {#914 // <- MY CUSTOMER RELATION (M-1)
       user_id: 7,
       restaurant_id: 4,
       // ...
       created_at: "2018-01-30 17:52:33",
       updated_at: "2018-01-30 23:32:00",
       deleted_at: null,
     },
     deliverer: null,  // <-- THIS SHOULD CONTAIN THE EMPLOYEE DATA
//                            THAT BELONGS TO THE DELIVERER RELATION
     }

我究竟做錯了什么?

-----

我的邏輯信息。

楷模

訂購

在我的Order模型中,我已經定義了其他關系(我的所有主鍵都遵循這個約定: model_id ):

/**
 * Return the user who created the order.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function customer()
{
    return $this->belongsTo(
        'App\Models\User',
        'user_id',
        'user_id'
    );

}

/**
 * Return the employee (user) who deliver the order.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function deliverer()
{
    return $this->belongsTo(
        'App\Models\User',
        'employee_id',
        'user_id'
    );
}

用戶

/**
 * A customer can make many orders
 * 
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function ordersMade()
{
    return $this->hasMany('App\Models\Order',
        'user_id',
        'user_id'
    );
}

/**
 * An employee attends many orders.
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function ordersDelivered()
{
    return $this->hasMany('App\Models\Order',
        'employee_id',
        'user_id'
    );
}

桌子

這是我的orders表的架構:

訂單表

這是我的users表的架構:

用戶表


更新資料

是的,我有ID為67用戶:

表

在Tinker中,我已經完成了:

>>> $o = App\Models\Order::find(30);
>>> $o->customer;
>>> $o->restaurant;
>>> $o->deliverer;
>>> $o;

好吧,我的代碼沒有任何問題。 我在模型softDeletes設置為true ,因此我試圖獲取“已刪除”元素的屬性。

就如此容易。 感謝@MahdiYounesi,他讓我檢查了一下。

盡管該問題幾乎是一個愚蠢的問題,但值得注意的是,當您從實體查詢softDeleted需要返回softDeleted記錄時,您可以-正如文檔 withTrashed() -在需要這種查詢的每個查詢中添加withTrashed()的結果,或者在定義如下關系時直接在模型中:

/**
 * Return the user who created the order.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function customer()
{
    return $this->belongsTo(
        'App\Models\User',
        'user_id'
    )->withTrashed();

}

/**
 * Return the employee (user) who deliver the order.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function deliverer()
{
    return $this->belongsTo(
        'App\Models\User',
        'employee_id',
        'user_id'
    )->withTrashed();
}

這將收集“已刪除”數據,例如對歷史信息有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM