【问题标题】:Accessing The Laravel SQL Relationship without Local Key不使用本地键访问 Laravel SQL 关系
【发布时间】:2021-06-26 01:45:30
【问题描述】:

我是 Laravel 的新手。我有两个模型:UserCar。我希望从控制器中的用户实体访问汽车数据,但我找不到如何去做。此外,数据库是固定的列,管理员拒绝对其进行任何更改。

这是User 模型:

class User extends Model {
  protected $primaryKey = 'idUser';
  protected $fillable = [
    'name', 'age', 'address', 'gender', 'phone', 'email'
  ];
}

然后这是我的Car 模型:

class Car extends Model {
  protected $primaryKey = 'idCar';
  protected $fillable = [
    'carNumber', 'carMachineNumber', 'type', 'model', 'year', 'idUser'
  ];

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

在控制器和刀片模板中,我希望我可以从用户实体访问汽车数据。例如,当我想获取汽车类型数据时,我会通过以下方式访问它:

$user->car->type

如果我能够通过这行代码访问用户拥有的所有汽车,那就更好了:

$user->car->all();

如何使它成为可能?我应该向控制器添加什么而不对数据库进行任何更改?谢谢。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您没有标准主键 id,因此您必须指定关系中的所有键 (idCar)。

    车型

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

    但这会让你得到$car->user,它是车主。 通过您设计数据库的方式,一个用户可以拥有许多汽车。

    用户模型

    public function cars() {
        return $this->hasMany(Car::class, 'idUser', 'idUser');
    }
    

    当您想检索属于某个用户的汽车时,您可以

    $user->cars;
    

    foreach($user->cars as $car) {
        // $car
    }
    

    【讨论】:

    • 你能解释一下为什么你把idUser作为idCar的外键吗?这种关系不是说 汽车 1 属于用户 1,汽车 2 属于用户 2,等等?这是否适合 汽车 1 和汽车 2 属于用户 1 的情况?
    • 在 Car 模型中,有一个字段 idUser 是 User 模型的外键。 idCar 不是外键而是主键。
    • 对,一辆车可以属于一个用户,但一个用户可以有很多辆车。
    • 有了这些,我可以访问用户的汽车数据,而无需加入表/使用 where 语句,只需使用像 $user->car->all() 这样的雄辩关系吗?
    • 是的,只需 $user->cars 就可以获取所有汽车对象。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多