KMarto
KMarto

Reputation: 300

How to find a record using a field other than id in Yii 2

I have the following code where I want to find a model using a field called link instead of id. However, it doesn't seem to produce any results. Where could I be getting it wrong? It returns 404

public function actionView($link)
    {
        $model = News::find()->where(['link'=>$link])->all();
        return $this->render('view', [
            'model' => $model,
        ]);
    }

NB: in the search model, I have tried adding this:

 $query->andFilterWhere([
            'id' => $this->id,
            'link'=>$this->link,
            'category' => $this->category,
            'date' => $this->date,
            'userid' => $this->userid,
            'featured' => $this->featured,
        ]);

Upvotes: 0

Views: 284

Answers (5)

rushil
rushil

Reputation: 576

The problem is in your url

case 1)

http://localhost/projectName/backend/web/controllerName/actionName/username/rushil

Gives output : Not Found (#404)

case 2)

http://localhost/projectName/backend/web/controllerName/actionName/rushil

Gives output : Not Found (#404)

case 3)

http://localhost/projectName/backend/web/controllerName/actionName?username=rushil

this will work.

Solution : check your url and pass link parameter in url as shown in case 3

Upvotes: 1

KMarto
KMarto

Reputation: 300

For anyone who may encounter such an error, the problem is after using pretty urls, you need to add rules to map the url format. C:\xampp\htdocs\your_project\frontend\config\main.php under urlManager add the rules like so:

'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Disable index.php
        'showScriptName' => false,
        // Disable r= routes
        'enablePrettyUrl' => true,
        'rules' => array(
                '<controller:\w+>/<id:\d+>' => 'news/view',
             '<controller:\w+>/<link>' => 'news/latestnews', // This is required for $link parameter
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>/<link>' => 'news/latestnews',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        ),
        ],
    ],

Upvotes: 0

Yupik
Yupik

Reputation: 5032

In UrlManager config you propably have:

'<controller>/<action>/<id:\d+>' => '<controller>/<action>',

It means default rewrite rules use id as param and it has to be digit, so you can't use controller/view/link. Just to be sure, change action name from actionView to actionTest and then call URL controller/test?link=linklink.

Other solution is to use URL like this: controller/view?link=linklink

Upvotes: 1

ScaisEdge
ScaisEdge

Reputation: 133360

If you want a single model you need one() and not all()

public function actionView($link)
{
    $model = News::find()->where(['link'=>$link])->one();
    return $this->render('view', [
        'model' => $model,
    ]);
}

With one() method you retrive just a model and in your $model you have the data you need ..

If you sue all() lie you did you retrive a collection of models and for accessing a single model you must set a proper index eg:

$my_model = $model[0];

Upvotes: 2

Anton Rybalko
Anton Rybalko

Reputation: 1314

404 means your action was not found by url manager. link parameter must be in the url (http://yourapp/controller/view?link=something) because you definded it as actionView($link)

Requesting http://yourapp/controller/view will give you 404 error.

Upvotes: 0

Related Questions