Yii2 ORM Smart получить родственную модель - PullRequest
0 голосов
/ 06 июля 2018

У меня есть 3 модели Yii2 ActiveRecord: Emplpoyee, Department и Organization.

Employee должен иметь либо один Department, либо один Organization, что обеспечивается проверкой (сбой, если оба значения department_id и organization_id равны null или оба не null). Department должен иметь один Organization, это стандартное отношение yii2 ORM через hasOne().

Gii создал этот код для отношения сотрудника / организации:

class Employee
{
    public function getOrganization()
    {
        return $this->hasOne(app\models\Organization::class, ['id' => 'organization_id']);
    }
}

Поэтому, когда я позвоню $employeeObject->organization, я получу null, если organization_id в таблице SQL равно нулю.

Я хочу изменить эту стандартную функцию получения так, чтобы она возвращала $this->department->organization, чтобы иметь возможность получить $employee->organization через магический метод получения, как это: если у сотрудника есть отдел - организация получает из отдела, в противном случае - через стандартное отношение.

Обновление: , если я напишу:

/**
 * @return ActiveQuery
 */
public function getOrganization()
{
    if (!is_null($this->organization_id)) {
        return $this->hasOne(app\models\Organization::class, ['id' => 'organization_id']);
    } elseif (!is_null($this->department)) {
        return $this->department->getOrganization();
    } else {
        // We should not be here, but what if we are?
    }
}

Как мне справиться с ситуацией разрыва связи с Department или с обоими organization_id и department_id является null? Какие ActiveQuery я должен вернуть?

1 Ответ

0 голосов
/ 07 июля 2018

Определения отношений используются для построения запроса SQL для связанных моделей. В некоторых случаях (активная загрузка, объединения) запрос должен быть создан до того, как вы получите фактический объект, поэтому вы не можете использовать if ($this->organization_id), потому что $this не является реальной моделью, а $this->organization_id всегда будет null. Единственное, что вы можете получить - это определить регулярные отношения без каких-либо условий и метод получения (getOrganizationModel()), который вернет правильную организацию из отношений:

class Employee extends ActiveRecord {

    public function getDepartment() {
        return $this->hasOne(Department::class, ['id' => 'department_id']);
    }

    public function getOrganization() {
        return $this->hasOne(Organization::class, ['id' => 'organization_id']);
    }

    public function getOrganizationModel() {
        if ($this->organization_id !== null) {
            return $this->organization;
        }

        return $this->department->organization;
    }
}

class Department extends ActiveRecord {

    public function getOrganization() {
        return $this->hasOne(Organization::class, ['id' => 'organization_id']);
    }
}

Затем вы можете запросить записи с обоими отношениями и использовать getter для получения организации:

$employees = Employe::find()->with(['department.organization', 'organization'])->all();
foreach ($employees as $employee) {
    echo $employee->getOrganizationModel()->name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...