how to solve Column 'first_name' in where clause is ambiguous

i have two table person an user and person is linked with user,both have first_name now in search model, i using relation where it is giving me error Column ‘first_name’ in where clause is ambiguous.

You have to "prefix" the attributes with the respective tablename.

For example like:




$query->andFilterWhere([

   'firstTable.first_name' => $this->first_name,

]);


$query->andFilterWhere([

   'secondTable.first_name' => $this->first_name2,

]);



Hope you understand.

If not:

Post your SearchModel code here.

(and please format it with the code tags!)

Regards




<?php


namespace app\models;


use Yii;

use yii\base\Model;

use yii\data\ActiveDataProvider;

use app\models\Person;


/**

 * PersonSearch represents the model behind the search form about `app\models\Person`.

 */

class PersonSearch extends Person

{

    /**

     * @inheritdoc

     */

    public function rules()

    {

        return [

            [['id', 'user_device_id', 'gender', 'mobile_no', 'alternate_contact_no', 'parent_id', 'status'], 'integer'],

            [['first_name', 'middle_name', 'last_name', 'short_name', 'date_of_birth', 'email', 'address'], 'safe'],

        ];

    }


    /**

     * @inheritdoc

     */

    public function scenarios()

    {

        // bypass scenarios() implementation in the parent class

        return Model::scenarios();

    }


    /**

     * Creates data provider instance with search query applied

     *

     * @param array $params

     *

     * @return ActiveDataProvider

     */

    public function search($params)

    {

       $user_id=Yii::$app->user->identity->id;

       $user_type=Yii::$app->user->identity->user_type;

       $query='';

       if($user_type==Self::ADMIN ){

        $query = Person::find();

    }elseif($user_type==Self::DEALER){

        $query=Person::find()->where(['parent_id'=>$user_id]);

    }elseif($user_type==Self::CUSTOMER){

        $query=Person::find()

        ->joinWith(['personalUser'])

        ->andHaving(['user_id'=>$user_id]); 

      //  $order->link('items', $item);

    }


        $dataProvider = new ActiveDataProvider([

            'query' => $query,

        ]);


        $this->load($params);


        if (!$this->validate()) {

            // uncomment the following line if you do not want to any records when validation fails

            // $query->where('0=1');

            return $dataProvider;

        }


        $query->andFilterWhere([

            'id' => $this->id,

            'user_device_id' => $this->user_device_id,

            'gender' => $this->gender,

            'date_of_birth' => $this->date_of_birth,

            'mobile_no' => $this->mobile_no,

            'alternate_contact_no' => $this->alternate_contact_no,

            'parent_id' => $this->parent_id,

            'status' => $this->status,

        ]);


        $query->andFilterWhere(['like', 'first_name', $this->first_name])

            ->andFilterWhere(['like', 'middle_name', $this->middle_name])

            ->andFilterWhere(['like', 'last_name', $this->last_name])

            ->andFilterWhere(['like', 'short_name', $this->short_name])

            ->andFilterWhere(['like', 'email', $this->email])

            ->andFilterWhere(['like', 'address', $this->address]);


        return $dataProvider;

    }

}



thanku i solved this using below code




 $query->andFilterWhere([

            'id' => $this->id,

            'first_name'=>$this->first_name,

            'user_device_id' => $this->user_device_id,

            'gender' => $this->gender,

            'date_of_birth' => $this->date_of_birth,

            'mobile_no' => $this->mobile_no,

            'alternate_contact_no' => $this->alternate_contact_no,

            'parent_id' => $this->parent_id,

            'status' => $this->status,

        ]);


        $query->andFilterWhere(['like', 'person.first_name', $this->first_name])

            ->andFilterWhere(['like', 'middle_name', $this->middle_name])

            ->andFilterWhere(['like', 'last_name', $this->last_name])

            ->andFilterWhere(['like', 'short_name', $this->short_name])

            ->andFilterWhere(['like', 'email', $this->email])

            ->andFilterWhere(['like', 'address', $this->address]);


        return $dataProvider;



i have done like this ,is it right




 $query->andFilterWhere(['like', ''.Person::tableName().'.first_name', $this->first_name])

            ->andFilterWhere(['like', 'middle_name', $this->middle_name])

            ->andFilterWhere(['like', ''.Person::tableName().'.last_name', $this->last_name])

            ->andFilterWhere(['like', 'short_name', $this->short_name])

            ->andFilterWhere(['like', 'email', $this->email])

            ->andFilterWhere(['like', 'address', $this->address]);



Well, I would say:

When it works it is at least not wrong. :)

Regarding this case my code looks pretty similar.

But since you wrote you have solved it I have not read all the code.

If someone knows better solutions:

feel free to enlighten us.

Regards