AMILO
AMILO

Reputation: 19

Yii2 : Getting class name from relation attribute

I went through all API documentation of Yii 2.0 to find a way to reverse back to relation class name from a model attribute.

let us suppose that class Customer has a relation $this->hasOne(Country::className(), ['id' => 'countryId']);

and in a controller function the parameter was the attribute "countryId". How is it possible to detect the class name for the related model

Upvotes: 0

Views: 3562

Answers (2)

BVBAccelerate
BVBAccelerate

Reputation: 182

I'm not very clear on what data you have to start with here. If you only have a column countryId I am not sure. But say you have the relation name 'country' and the following code in your Customer model:

public function getCountry()
{
   return $this->hasOne(Country::className(), ['id' => 'countryId']);
}

This is what I would do:

$relationName = 'country';
$customer = new Customer;
$relation = $customer->getRelation($relationName);
$relationModelClass = $relation->modelClass;

You could look at \yii\db\ActiveQuery::joinWithRelations() for how they do it.

Upvotes: 0

Mihai P.
Mihai P.

Reputation: 9367

Get the name of the class by removing Id from the end of the variable and capitalize it. But I cannot image any situation where this would be a normal development practice. You can also define am array to make this translation for the model.

You can try to use http://php.net/manual/en/intro.reflection.php to get the names of all the functions and try to guess the name of the relation / model based on the name of the field. If you name your classes and relation fields in a proper name then you should be able to try to again guess the model.

This still feels like a hack, create a function that returns the name of the model based on the field... easiest solution. I know you try to be lazy but this is a hacky way of programming.

Upvotes: 1

Related Questions