Search code examples
yii2yii2-advanced-appyii-extensionsyii-componentsyii2-basic-app

Yii 2 Active Query joinWith issue


I have a Active Record model "Event" with a hasOne relation 'getUser'. Now, if I do :

 $eventModels = Event::find()->joinWith([
        'user' => function($q){


        return $q;

    }])->all();

----------------------------------------------------
    foreach($eventModels as $m){

        var_dump($m->user); //Everything good as $m->user returns the related user object
        die('skdw');


    }

But, if I add the "select" in the joinWith query, then related "user" object becomes null. Here is the issue :

 $eventModels = Event::find()->joinWith([
        'user' => function($q){

        $q->select('email');// or, ['email'] or ['user.email'] etc. fields. 

        return $q;

    }])->all();

----------------------------------------------------
    foreach($eventModels as $m){

        var_dump($m->user); // Returns NULL

       die('skdw');


    }

But, if I make it $q->select('*'), then $m->user working .

I believe it used to work in some previous versions of Yii 2 (Right now, I am working on Yii 2.0.9)

Is this expected behavior ? If yes, then what is the solution to fetch only some select fields for the related joinWith model ? I don't want to fetch all the related fields as some of the related fields might contain "TEXT" data type.


Solution

  • You need to select the primary key column for the relation for Yii to build them.

    e.g. assuming your column is called id

    $eventModels = Event::find()->joinWith(['user' => function($q){
        $q->select(['id', 'email']);
    }])->all();
    

    Also, you don't need to return the $q variable.