() отношение с условием получить все записи - Laravel - PullRequest
0 голосов
/ 18 октября 2018

Я хочу получить только перечисленные организации, но база данных возвращает все записи.

, как вы можете видеть ниже, запись не должна возвращаться как перечисленная организация, которую я включил ниже кода, а также мою Модель ирезультат, который я получил из базы данных

      $organisations = Organisation::with(['year_status' => function ($query) use ($year_id) {
                    $query->where(['year_id' => $year_id, 'is_listed' => 1]);
                }])->get();



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

 and what I got :

11 => Organisation {#630 ▼
      #fillable: array:8 [▶]
      #connection: "mysql"
      #table: null
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:14 [▼
        "id" => 39
        "organisation" => "Test Organisation"
        "sector_id" => 1
        "country_id" => 1
         ]
      #original: array:14 [▶]
      #changes: []
      #casts: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: array:1 [▼
        "year_status" => Collection {#632 ▼
          #items: []
        }
      ]
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }

структура базы данных:

id  
organisation_id
year_id
is_listed

1 Ответ

0 голосов
/ 18 октября 2018

Убедитесь, что ваши отношения установлены (модель организации hasMany year_status) и что ваши поля находятся в видимом массиве в модели YearStatus.

Кроме того, используемый вами запрос переводится на:

SELECT * FROM organizations where exists 
  (select * from year_status where organizaton_id = organizations.id 
   and year_id = $year_id and is_listed = 1)

Он не выбирает ВСЕ записи, существующие в базе данных, он выбирает из-за взаимосвязи + добавленные вами поля

Примечание. Если вы хотите выбрать только организацию, котораяЕсли у вас есть OrganizationYearStatus, то вы должны использовать:

Organisation::whenHas('year_status' => function ($advancedWhenHas) use ($year_id) { 
  $advancedWhenHas->with(['year_status' => function ($query) use ($year_id) {
                    $query->where(['year_id' => $year_id, 'is_listed' => 1]);
}}])->get();

Вы можете ввести ->toSql() вместо ->get(), чтобы убедиться, что ваш запрос соответствует ожидаемому

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...