Laravel/Lumen - 使用 Model::with()

Posted

技术标签:

【中文标题】Laravel/Lumen - 使用 Model::with()【英文标题】:Laravel/Lumen - Using Model::with() 【发布时间】:2020-05-19 04:45:32 【问题描述】:

我有两张桌子: Coretable 和 extensiontable_itc。 它们是 1-n 关系,extensiontable_itc 可以有 N 条记录引用 coretable 上的 1 条记录。

如果理解正确,我在这里学到了 Laravel - Eloquent "Has", "With", "WhereHas" - What do they mean?

model::with('relatedModel')->get() 可以从 coretable 和 extensiontable_itc 获取所有记录,只要 extensiontable_itc 记录引用了 coretablerecords。

但是,当我将其应用于我的代码时:

$join = coretable::with('extensiontable_itc')->get();
log::info($join);

我收到以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'extensiontable_itc.extensiontable_itc' in 'where clause' (SQL: select * from `extensiontable_itc` where `extensiontable_itc`.`extensiontable_itc` in (1))

据我了解,它在我的 extensiontable_itc 表上寻找“extensiontable_itc”列。这当然行不通,但我不明白为什么会这样? 外键在我的数据库中,各自的模型应该没问题,这是他们的代码:

coretable.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class CoreTable extends Model


  /**
  * The table associated with the model.
  *
  * @var string
  */
  protected $table = 'coretable';
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable = [
    'Internal_key'
  ];



  /**
   * Many-To-Many relationship with User-Model.
   */
  public function extensiontable_itc()
  
    return $this->hasOne('App\extensiontable_itc', 'extensiontable_itc');
  

  public function inaccessibletable()
  
    return $this->hasOne('App\inaccessibletable', 'inaccessibletable');
  

extensiontable_itc.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class extensiontable_itc extends Model


  /**
  * The table associated with the model.
  *
  * @var string
  */
  protected $table = 'extensiontable_itc';
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable = [
    'description'
  ];



  /**
   * Many-To-Many relationship with User-Model.
   */
  public function coretable()
  
    return $this->hasOne('App\coretable', 'coretable');
  

这里是我的数据库中外键的概述:

+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| TABLE_NAME                         | COLUMN_NAME                 | CONSTRAINT_NAME                      | REFERENCED_TABLE_NAME    | REFERENCED_COLUMN_NAME |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| ad_usersxad_groups                 | Ad_user_id                  | fk_ad_groupxad_user                  | ad_users                 | id                     |
| ad_usersxad_groups                 | Ad_group_id                 | fk_ad_userxad_group                  | ad_groups                | id                     |
| extensiontables_registryxad_groups | ad_group_id                 | fk_ad_groupxextensiontables_registry | ad_groups                | id                     |
| extensiontables_registryxad_groups | extensiontables_registry_id | fk_extensiontables_registryxad_group | extensiontables_registry | id                     |
| extensiontable_itc                 | coretable_id                | fk_extensiontable_itc_coretable      | coretable                | id                     |
| inaccessibletable                  | coretable_id                | fk_inaccessibletable_coretable       | coretable                | id                     |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+

【问题讨论】:

【参考方案1】:

return $this->hasOne('App\ModelName', 'foreign_key', 'local_key');

出现问题是因为当你使用with('extensiontable_itc');

laravel根据你的关系方法extensiontable_itc找到foreign_key,你给的就是extensiontable_itc,而你没有这个列,

在 hasOne 方法中将 extensiontable_itc 更改为 coretable_id

  public function extensiontable_itc()
  
    return $this->hasOne('App\extensiontable_itc', 'coretable_id');
  

coretable 有一个extensiontable_itcextensiontable_itc 属于coretable,您需要使用 belongsTo 方法来细化 hasOne 关系的逆:

  public function coretable()
  
    return $this->belongsTo('App\coretable', 'coretable_id');
  

更多参考:one-to-one

【讨论】:

以上是关于Laravel/Lumen - 使用 Model::with()的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 5.4 与 Laravel 可邮寄

在 Laravel 5 (Lumen) 中使用基本路径

使用 Laravel/Lumen 5.2 和 apache 2.4

Laravel / Lumen 只读模型?

Laravel/lumen 5.2 从现有数据库生成迁移表

为啥 GuzzleHttp 客户端在 Laravel/Lumen 上使用它发出网络请求时会抛出 ClientException?