【问题标题】:Laravel eager load model from a hasMany relationship来自 hasMany 关系的 Laravel 急切加载模型
【发布时间】:2018-12-11 15:32:01
【问题描述】:

有 3 个表:

users:身份证,姓名

compliments:身份证,姓名

users_compliments: id、compliment_id、user_id、complimentor_id

这是我的用户模型:

class User extends Model
    public function sent_compliments()  {  
        return 
            $this->belongsToMany(
            'Compliment', 
            'users_compliments', 
            'complimentor_id',
            'compliment_id'
         )->withPivot('user_id');
}

如果我运行$user->sent_compliments()->get(),这是一个示例响应

Illuminate\Database\Eloquent\Collection {
     all: [
       Compliment {
         id: 2,
         name: "You are smart",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 6,
           id: 99,
         },
       },
       Compliment {
         id: 52,
         name: "You are funny",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 42,
           id: 186,
         },
       },
     ],
   }

但这是我想要的响应(它包括实际的用户模型,而不仅仅是数据透视表中的 user_id)

Illuminate\Database\Eloquent\Collection {
     all: [
       Compliment {
         id: 2,
         name: "You are smart",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 6,
           id: 99,
         },
         user {
             id: 6,
             name: "John"
         }
       },
       Compliment {
         id: 52,
         name: "You are funny",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {
           user_id: 42,
           id: 186,
         },
           user {
             id: 42,
             name: "Alex"
         }
       },
     ],
   }

有没有办法通过雄辩的急切负载(例如使用 With:: 命令)而不是遍历数据透视表、收集 user_ids 并手动查询 User 表来获取这些数据?

【问题讨论】:

  • 请显示sent_nominations方法
  • sent_compliments 方法发布在上面的问题中。它在User 模型中。 public function sent_compliments()@Alihosseinshahabi
  • @Alihosseinshahabi 抱歉,我的问题有误。 sent_nominations 不存在。应该是sent_compliments ...我刚刚更新了问题,对于造成的混乱,我深表歉意

标签: php laravel eloquent eager-loading


【解决方案1】:

您需要定义 pivot 类并将关系 belongsTo 添加到 user_id 的透视模型

用户模型

public function sent_compliments()  {  
    return 
        $this->belongsToMany(
        'Compliment', 
        'users_compliments', 
        'complimentor_id',
        'compliment_id'
     )->withPivot('user_id')->using('App\UserComplement');
}

枢轴模型 使用 Illuminate\Database\Eloquent\Relations\Pivot;

class UserComplement extends Pivot {
    protected $table = 'users_compliments';

    public function user(){
        return $this->belongsTo('App\User', 'user_id');
    }
}

Feth 数据

//if you have user instance already then
$complements = $user->sent_compliments;

//if you don't have fetched user yet then try this 
$user = User::with('sent_compliments')->find($userId);
$complements = $user->sent_compliments;

foreach($complements as $complement){
    dd($complement);
    dd($complement->pivot->user);
}

详情请查看Defining Custom Intermediate Table Models https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

编辑

正如@JonasStaudenmeir 指出的那样,没有办法急切加载pivot user 关系。这是另一个解决方案

用户模型

public function sent_compliments()  {  
    return $this->hasMany(UserCompliment::class , 'complimentor_id');
}

UserComplement 模型

class UserComplement extends Model {
    $table = 'users_compliments';

    public function complimentor()  {  
        return $this->belongsTo(User::class , 'complimentor_id');
    }

    public function complement()  {  
        return $this->belongsTo(Compliment::class , 'compliment_id');
    }

    public function user()  {  
        return $this->belongsTo(User::class , 'user_id');
    }
}

获取数据

$user = User::with('sent_compliments','sent_compliments.complement', 'sent_compliments.user')->find($userId);
$sentComplements = $user->sent_compliments;

foreach($sentComplements as $sentComplement){
    dd($sentComplement->complement);
    dd($sentComplement->user);
}

希望它能让你明白

【讨论】:

  • 感谢您的帮助,但这没有用......唯一的区别是现在回复说pivot: UserNominationPivot而不是pivot: Illuminate\Database\Eloquent\Relations\Pivot......但是user模型仍然不在响应中
  • 你导入了错误的Pivot类,这是一个经过测试的代码。让我在那里添加枢轴导入类
  • 我已经添加了导入,在你的代码中使用它然后尝试
  • 你是如何获取User 模型的?
  • 你必须创建 UserComplement 类并扩展 Pivot 并将其添加到这样的关系中 `->using('App\UserComplement');'
猜你喜欢
  • 2021-11-29
  • 2017-09-17
  • 2013-06-10
  • 1970-01-01
  • 2017-04-12
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多