【问题标题】:Two relationships between two same models/tables两个相同模型/表之间的两种关系
【发布时间】:2018-07-11 00:03:18
【问题描述】:

问题

您好,我在尝试在两个模型(Laravel 5.5)之间建立两个关系时遇到了一些麻烦:OrderUser

1-----m |一个User(作为客户)可以赚很多Orders
1-----米 |一个User(作为员工)可以带很多Orders

所以,在我的orders 表中,我有user_idemployee_id 作为外键。

现在,有些订单没有初始employee_id,因为需要接受订单,然后我设置了该值。

使用 tinker,我找到了这个 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;

【问题讨论】:

  • 您有 id 为 6 的用户吗?
  • 你能展示你在 Tinker 中运行什么来获得输出吗?
  • @MahdiYounesi 我已经更新了我的问题以添加所需的信息。
  • @MahdiYounesi 哦,我的上帝。我忘记了我激活了softDeletes,所以记录会持续,但“逻辑上”该对象被删除。我觉得自己很愚蠢,我已经审查了我的代码将近几个小时了。
  • @HCK 很高兴您的问题得到解决

标签: php mysql laravel foreign-keys laravel-5.5


【解决方案1】:

嗯,我的代码没有任何问题。我在我的模型上将softDeletes 设置为true,所以我试图获取“已删除”元素的属性。

就这么简单。感谢@MahdiYounesi,他让我检查了这一点。

虽然这个问题几乎是一个愚蠢的问题,但需要注意的是,当您在从实体查询时还需要返回 softDeleted 记录时,您可以像 docs 所说的那样添加 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();
}

这将收集“已删除”的数据,例如对历史信息有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多