【问题标题】:laravel/elequent - models and relationslaravel/eloquent - 模型和关系
【发布时间】:2020-04-14 17:10:10
【问题描述】:

我尝试学习 laravel 并做一些测试/演示应用程序。我现在一直在努力解决 laravel/eloquent 表的关系。我需要建议。

我有 3 个模型 [Application, Term, AppState] 及其表 applications[id, terms_id, appStates_id, and other cols], terms[id, startDate, endDate, ...], app_states[id, caption]

Application.php

    public function term()
    {
        return $this->belongsTo('App\Term');
    }
    public function appState()
    {
        return $this->belongsTo('App\AppState');
    }

Term.phpAppState.php 我有:

    public function applications()
    {
        return $this->hasMany('App\Application');
    }

如何在刀片中为每个应用程序说“caption”/“startDay”+“endDate”?我可以在 foreach 循环中获取他们的 ID $app->terms_id/$app->appStates_id,但我想从 app_states 表中获取 caption 值。

必须在迁移中也指定这种关系吗?在某些 tuts 中提到,如果我只想在 laravel 中处理它,则不需要。

感谢您的建议

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您可以通过像属性一样调用关系方法来访问模型的关系值。

    $application = Application::find(1);
    
    $application->term->startDate;
    $application->term->endDate;
    $application->appState->caption;
    

    另外你与AppState 的关系是错误的,因为你的外键没有跟随snake_case 的输入,你需要为它提供适当的键

    public function appState()
    {
        return $this->belongsTo('App\AppState', 'appStates_id');
    }
    

    您可能还想检查terms_id,因为型号名称 (Term) 是单数,但外键是复数。

    必须在迁移中也指定这种关系吗?在某些 tuts 中提到,如果我只想在 laravel 中处理它,则不需要。

    嗯,是的,如果 Laravel 只是访问该数据库的人,你就不需要这样做。但是,如果在不久的将来您决定迁移到不同的框架或在另一个应用程序中使用相同的数据库,那么最好将这些关系包含在迁移中。如果您不这样做,数据库管理员也可能会畏缩。

    【讨论】:

    • 感谢您的回复...我之前尝试过,但不起作用 -> 我收到“尝试获取非对象的属性 'caption'”错误。
    • 哦,你的 appStates() 关系的外键有点不对。我更新了我的答案
    • 谢谢,它有效...我想我会重命名几列... ;)
    【解决方案2】:

    因此,只要您的关系设置正确,您就可以在任何拥有该模型实例的地方访问它们。

    例如,假设您已将一组应用程序传递给您的视图 ($apps):

    @foreach($apps as $app)
        {{ $app->term->startDate }}
        {{ $app->term->endDate }}
    
        {{ $app->appState->caption }}
    @endforeach
    

    重要提示:我们使用 ->appState 而不是 ->appState() 访问 Eloquent 关系。后者实际上是访问一个 Query Builder 实例,并且有一些更高级的用例

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2021-10-01
      • 2018-10-20
      • 2021-07-04
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2016-01-16
      相关资源
      最近更新 更多