Как создать связь между 2 моделями без Has One/Many?

Для создания связи между двумя моделями в Yii без использования HasOne или HasMany методов, можно воспользоваться методом hasOne или hasMany, но установить связь с использованием пользовательской функции.

Давайте рассмотрим пример с двумя моделями - User и Profile. Предположим, что у каждого пользователя может быть только один профиль, и связь между этими моделями будет установлена через поле user_id в таблице profile.

1. Создаем две модели - User и Profile.

namespace appmodels;

use yiidbActiveRecord;

class User extends ActiveRecord
{
    public static function tableName()
    {
        return 'user';
    }

    public function getProfile()
    {
        return $this->hasOne(Profile::class, ['user_id' => 'id']);
    }
}

class Profile extends ActiveRecord
{
    public static function tableName()
    {
        return 'profile';
    }
}

2. В модели User создаем метод getProfile, который будет возвращать объект связанной модели Profile. В этом методе мы используем метод hasOne и указываем соответствие полей user_id и id в таблицах profile и user соответственно.

3. Добавляем поле user_id в таблицу profile.

   ALTER TABLE profile ADD COLUMN user_id INT(11) NOT NULL;

4. Используем связь в коде.

$user = User::findOne(1);
$profile = $user->getProfile()->one();

echo $profile->first_name;
echo $profile->last_name;

Вышеуказанный код получает первого пользователя из таблицы user и затем получает его профиль, используя связь getProfile(). Затем выводятся first_name и last_name из профиля полученного пользователя.

Таким образом, связь между моделями User и Profile создается через метод getProfile(), который возвращает связанную модель. Пользовательская функция getProfile() используется для задания пользовательской логики связи между моделями.