php, sql , получить данные в той же таблице по индификатору

у меня есть данная таблица

введите сюда описание изображения


class AjaxController extends Controller
{
    public function actionLocality()
    {
        if (Yii::$app->request->isAjax) {
            $data = Yii::$app->request->get();
            $s = trim($data['keyword']);

                       $locality = Locality::find()->select(['title', 'type'])
                ->where(['like', 'title', $s])
                ->asArray()
                ->all();

            if (!empty($locality)) {
                return JSON::encode($locality);
            }
        }

        return JSON::encode(null);
    }
}

столбец partner_id хранит индификаторы(id) этой же таблицы

Я хочу получить также информацию по parent_id

Для примера: я хочу получить информацию по ID 51, у него parent_id 30110, то также взять и информацию по данному индификатору(30110)

Не делая циклов , а если можно одним запросом (если это возможно)


Ответы (1 шт):

Автор решения: Евгений Малеев

В модель таблицы добавь метод:

public function getParent()
{ 
      return $this->hasOne(self::className,['id' =>'parent_id']);
}

Потом в нужном месте вызываешь:

$locality ->parent->title

Ну или в виджетах:

parent.title

Единственное, убери asArray() из запроса. Тогда сможешь обращаться к объекту $locality. Теперь сможешь получать в месте с обьектом $locality под id =51, объект под id=30110. А также смотреть у объекта id=30110 его parentId. Выглядеть будет

parent.parent.title

Yii поддерживает кучу уровней вложенности. А если нужно будет перевести в массив используй ArrayHelper.

$locality = Locality::find()
            ->where(['like', 'title', $s])
            ->all();

if (!empty($locality)) {
            return JSON::encode(
ArrayHelper::toArray($locality, [
'app\models\Locality' => [
        'id',
        'title',
        'parent.id',
        'parent.title',
        'parent.parent_id', //Если нужно вывести другие аттрибуты 30110
        'length' => function ($locality) {
            return strlen($locality->id);
        },
    ],
])
);
        }
→ Ссылка