【问题标题】:Laravel define relationship between two tablesLaravel 定义两个表之间的关系
【发布时间】:2020-10-13 18:05:24
【问题描述】:

我有以下表格

1. Environment
--------------
env_id
env_name
env_description
repo_id

2. Repository
--------------
repo_id
repo_name
repo_url

现在可以将多个环境与同一个存储库关联。我对 Eloquent 很陌生,所以对这是哪种关系感到困惑?我有一个 api,我想在访问环境 endoint 时返回 repo 详细信息。所以当我使用Evironment::all() 时,我想获取关联的Repository。我该怎么做?

我浏览了文档中给出的示例,但似乎我有一个没有提到的场景。

【问题讨论】:

  • Repository hasMany EnvironmentEnvironment hasMany Repository?
  • 不,您的方案正是文档中描述的 hasMany 关系......您只是缺少关系方面的加载
  • 所以我想我需要在Environment模型中添加关系repository()hasMany
  • 它的逆......环境属于存储库(因为存储库密钥在环境中);存储库有很多环境
  • 在这种情况下,使用Environment::all()时如何访问相关存储库。对不起,我很痛苦。

标签: sql laravel eloquent one-to-many many-to-one


【解决方案1】:

这将是一对多(反向)关系。

//Environment Model
public function repository()
{
    return $this->belongsTo('App\Repository');
}

//Repository Model
public function environments()
{
    return $this->hasMany('App\Environment', 'repo_id');
}

然后你可以返回所有的环境及其关系如下:

Environment::with('repository')->get();

【讨论】:

    【解决方案2】:

    根据你的描述,应该是两个表之间的一对多关系。因此,在简单的英语句子中,Repository 有很多Environments,Environment 模型属于Repository。让我们建立这两个模型。

    存储库模型:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Repository extends Model
    {
        public function environments()
        {
            return $this->hasMany(Environment::class);
        }
    }
    

    环境模型:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Environment extends Model
    {
        public function repo()
        {
            return $this->belongsTo(Repository::class);
        }
    } 
    

    注意:我以Environment::repo() 命名而不是Environment::repository()

    如果我们在 foreach 循环中调用 Environment::repository 作为 Environment 对象的属性,它将返回 null 而不是 Repository 对象。这可能是 eloquent 的命名问题。老实说,目前我还不知道原因。我正在使用 Laravel 7。

    创建完模型后,您可以使用它们来处理数据。由于您需要获取与Environment 对象关联的Repository 对象,请查看以下代码:

    <?php
    
    $environments = Environment::all();
    
    foreach ($environments as $environment) {
        echo $environment->repo->repo_name . '<br>';
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 2017-07-31
      • 2022-01-09
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多