【问题标题】:Laravel belongsTo returning null when using 'with'使用'with'时,Laravel belongsTo 返回 null
【发布时间】:2014-11-06 11:14:35
【问题描述】:

我刚刚开始使用 Laravel,所以请原谅任何菜鸟。

我有一个UserOrder 模型,一个用户有很多订单:

# Inside User model
public function orders()
{
    $this->hasMany('Order');
} 

# Inside Order
public function user()
{
    return $this->belongsTo('User');
}

// Not sure if this is upsetting anything (also in Order)
public function products()
{
    return $this->belongsToMany('Product');
}

所以我认为我有以上权利。

但是当我这样做时:

 $users = User::with('orders')->find(1);
 return $users;

我收到Call to a member function addEagerConstraints() on null

但是,如果我反过来做,效果很好:

$orders = Order::with('User')->get();
return $orders;

我做错了什么/我不明白什么?!还是我的问题比我想象的要大?

数据库:

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    问题是您的orders 关系没有return。应该是:

    public function orders(){
        return $this->hasMany('Order');
    } 
    

    您还应该使用区分大小写的关系。你展示了:

    $orders = Order::with('User')->get();
    

    正在工作,但您应该使用

    $orders = Order::with('user')->get();
    

    为了避免将来对您的数据库进行额外的查询

    【讨论】:

    • 也感谢您提供更多信息
    • 谢谢@Marcin。节省了一天
    • 感谢@Marcin,经过 2 年多的回答,您刚刚挽救了一条生命
    • @OniyaDaniel 很高兴它在 2 年多后很有帮助:)
    【解决方案2】:

    对于遇到此问题的其他人,我遇到了同样的问题,但我的问题是我交换了外键/本地键。示例:

    // This is correct for hasX relationships
    public function user() {
        return $this->hasOne('App\Models\User', 'user_id', 'local_key_user_id');
    }
    
    // This is correct for belongsTo relationships
    public function user() {
        return $this->belongsTo('App\Models\User', 'local_key_user_id', 'user_id');
    }
    

    注意对于hasX关系,外键是第二个参数,本地键是第三个。但是,对于 belongsTo 关系,这两者是交换的。

    【讨论】:

      【解决方案3】:

      可能没有回答这个特定的问题,但它与标题有关。我有同样的问题在这里是错误的查询

       $offer = Offer::with([
                  'images:name,id,offer_id',
                  'offer_options:offer_option,value,id,offer_id',
                  'user:id,name,avatar'])
                  ->select(['id', 'views', 'type', 'status'])
                  ->where('id', $id)->get();
      

      模型看起来像这样

      class Offer extends Model { 
      
      
      function user(): BelongsTo {
              return $this->belongsTo(User::class);
          }
      
      } 
      

      用户

      class User extends ..... {
      
          function offer(): HasMany {
             return $this->hasMany(Offer::class);
          }
      }
      

      查询的问题是我没有选择 user_id,即在我的 select 函数 user_id 列中不包括在内,这就是为什么我的用户为空

      根据 Laravel 文档

      使用此功能时,您应该始终包含 id 列和 您希望列列表中的任何相关外键列 检索。

      所以正确的查询是

      $offer = Offer::with([
                      'images:name,id,offer_id',
                      'offer_options:offer_option,value,id,offer_id',
                      'user:id,name,avatar'])
                      ->select(['id', 'views', 'type', 'status','user_id'])
                      ->where('id', $id)->get();
      

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 2014-07-30
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        • 1970-01-01
        • 2020-05-16
        相关资源
        最近更新 更多