Laravel / Lumen - Использование Model :: with () - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть две таблицы: Coretable и extensiontable_it c. Они имеют отношение 1-n, extensiontable_it c может иметь N записей, ссылающихся на 1 запись в coretable.

Если все правильно понять, я узнал здесь Laravel - красноречивое «Имеет», «С "," WhereHas "- Что они означают?

, что model::with('relatedModel')->get() может принести мне все записи из coretable и extensiontable_it c везде, где ссылки на coretablerecrec ссылаются на записи extensiontable_it c.

Однако, когда я применяю это к своему коду, как здесь:

$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_it c" в моей таблице extensiontable_it c. Это, конечно, не может работать, но я не понимаю, почему это происходит? Внешние ключи на месте в моей БД, и соответствующие модели должны быть в порядке, вот их код:

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_it c. 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                     |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

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

Проблема возникает из-за того, что вы используете with('extensiontable_itc');

laravel в соответствии с вашим методом отношений extensiontable_itc, чтобы найти иностранный_ключ, и что вы дали extensiontable_itc, и у вас нет этого столбца,

Измените на extensiontable_itc to coretable_id в методе hasOne:

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

и coretable имеет один extensiontable_itc, extensiontable_itc принадлежит coretable, вам необходимо откорректировать обратное отношение hasOne, используя Метод метод:

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

Дополнительная справка: один-к-одному

0 голосов
/ 03 февраля 2020

Измените свою модель следующим образом

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', 'coretable_id');
  }
}

extensiontable_it c. 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->belongsTo('App\coretable', 'coretable_id');
  }
}
...