SQL Join не дает нужного результата

Рейтинг: 0Ответов: 1Опубликовано: 01.07.2023

Есть вот такой запрос -

$tasks = Tasks::find()
        ->where('STATUS_ID = 1')
        ->join('LEFT JOIN', 'CITIES', 'TASKS.CITY_ID = CITIES.CITY')
        ->orderBy("PUBLICATION_DATE DESC")
        ->all();

Его SQL-запрос будет таким -

SELECT `TASKS`.* FROM `TASKS` LEFT JOIN `CITIES` ON TASKS.CITY_ID = CITIES.CITY WHERE STATUS_ID = 1 ORDER BY `PUBLICATION_DATE` DESC

Запрос ссылается на вторую таблицу CITIES, где внешним ключом есть связь с первой таблицей TASKS и соответственно к каждому задания я хочу видеть название города, а не его идентификатор. Результатом запроса является таблица, где в строке CITY_ID таблицы TASKS стоит число, а не название города. Не могу понять в чем проблема. Схема создания обеих таблиц:

    CREATE TABLE TASKS 
(
ID INT AUTO_INCREMENT PRIMARY KEY,
PUBLICATION_DATE DATETIME DEFAULT CURRENT_TIMESTAMP,
TITLE TEXT NOT NULL,
DESCRIPTION TEXT NOT NULL,
BUDGET INT,
FILES VARCHAR(255),
STATUS_ID INT,
EXECUTION_DATE DATETIME,
CATEGORY_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
EXECUTIONER_ID INT,
CITY_ID INT,
FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORIES(ID),
FOREIGN KEY (CUSTOMER_ID) REFERENCES USERS(ID),
FOREIGN KEY (EXECUTIONER_ID) REFERENCES USERS(ID),
FOREIGN KEY (CITY_ID) REFERENCES CITIES(ID),
FOREIGN KEY (STATUS_ID) REFERENCES STATUSES(ID)
);

    CREATE TABLE CITIES 
(
ID INT AUTO_INCREMENT PRIMARY KEY,
CITY TEXT,
LATITUDE DECIMAL(18, 7),
LONGDITUDE DECIMAL(18, 7) 
);

Результат по моему запросу

|_. ID |_. PUBLICATION_DATE |_. TITLE |_. DESCRIPTION |_. BUDGET |_. FILES |_. STATUS_ID |_. EXECUTION_DATE |_. CATEGORY_ID |_. CUSTOMER_ID |_. EXECUTIONER_ID |_. CITY_ID |
| 13 | 2023-07-01 11:38:30 | Doloribus. | Odio sit velit nihil. | 8087 |  | 1 |  | 1 | 1 |  | 592 |
| 6 | 2023-07-01 11:38:19 | Sit. | Eius et et ratione. | 2513 |  | 1 |  | 8 | 1 |  | 376 |
| 5 | 2023-07-01 11:38:17 | Magni. | Sint id assumenda aut. | 3667 |  | 1 |  | 8 | 1 |  | 210 |

UPD. Благодаря @InDevX смог сделать корректный JOIN и по итогу в SQL менеджере получаю таблицу с нужным названием города

 |_. ID |_. PUBLICATION_DATE |_. TITLE |_. DESCRIPTION |_. BUDGET |_. FILES |_. STATUS_ID |_. EXECUTION_DATE |_. CATEGORY_ID |_. CUSTOMER_ID |_. EXECUTIONER_ID |_. CITY_ID |_. TASK_CITY |
| 13 | 2023-07-01 11:38:30 | Doloribus. | Odio sit velit nihil. | 8087 |  | 1 |  | 1 | 1 |  | 592 | Мценск |
| 6 | 2023-07-01 11:38:19 | Sit. | Eius et et ratione. | 2513 |  | 1 |  | 8 | 1 |  | 376 | Карпинск |
| 5 | 2023-07-01 11:38:17 | Magni. | Sint id assumenda aut. | 3667 |  | 1 |  | 8 | 1 |  | 210 | Горняк |

Проблема теперь в том, что var_dump экземпляра модели не показывает созданный столбик, и в PHP я не могу к нему обратиться для вывода на страницу

object(app\models\Tasks)#86 (10) { ["_events":"yii\base\Component":private]=> array(0) { } ["_eventWildcards":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_attributes":"yii\db\BaseActiveRecord":private]=> array(12) { ["ID"]=> int(13) ["PUBLICATION_DATE"]=> string(19) "2023-07-01 11:38:30" ["TITLE"]=> string(10) "Doloribus." ["DESCRIPTION"]=> string(21) "Odio sit velit nihil." ["BUDGET"]=> int(8087) ["FILES"]=> NULL ["STATUS_ID"]=> int(1) ["EXECUTION_DATE"]=> NULL ["CATEGORY_ID"]=> int(1) ["CUSTOMER_ID"]=> int(1) ["EXECUTIONER_ID"]=> NULL ["CITY_ID"]=> int(592) } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(12) { ["ID"]=> int(13) ["PUBLICATION_DATE"]=> string(19) "2023-07-01 11:38:30" ["TITLE"]=> string(10) "Doloribus." ["DESCRIPTION"]=> string(21) "Odio sit velit nihil." ["BUDGET"]=> int(8087) ["FILES"]=> NULL ["STATUS_ID"]=> int(1) ["EXECUTION_DATE"]=> NULL ["CATEGORY_ID"]=> int(1) ["CUSTOMER_ID"]=> int(1) ["EXECUTIONER_ID"]=> NULL ["CITY_ID"]=> int(592) } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=> array(0) { } }

Ответы

▲ 0

Благодаря @InDevX нашел решение своего вопроса. По итогу отказался от join, теперь запрос выглядит так -

$tasks = Tasks::find()
        ->where('STATUS_ID = 1')
        ->orderBy("PUBLICATION_DATE DESC")
        ->all();

В моделях уже были настроены связи hasOne и hasMany, поэтому в файле index.php запрос к необходимой информации по связи выглядит следующим образом

$task->cATEGORY->CATEGORY 

Решение, как зачастую бывает, было на поверхности