Laravel – zoeken op aangepaste kolom of mislukken

Er is een findOrFail()-methode die 404 genereert als er niets is gevonden, bijvoorbeeld:

User::findOrFail(1);

Hoe kan ik een entiteit vinden op aangepaste kolom of fout, zoiets als dit:

Page::findBySlugOrFail('about');

Antwoord 1, autoriteit 100%

Probeer het als volgt:

Page::where('slug', '=', 'about')->firstOrFail();    
// or without the explicit '='
Page::where('slug', 'about')->firstOrFail();

Antwoord 2, autoriteit 3%

Bijwerken:
Ik gebruik momenteel Laravel 6.9.0 en ik bevestig dat @jeff-puckett gelijk heeft. Waar clausule werkt prima. Zo werkt het op mijn knutselaar.

>>> \App\Models\User::findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
     id: "123b5545-5adc-4c59-9a27-00d035c1d212",
     name: "John",
     surname: "Graham",
     email: "[email protected]",
     email_verified_at: "2020-01-03 16:01:53",
     created_at: "2020-01-03 16:01:59",
     updated_at: "2020-01-03 16:01:59",
     deleted_at: null,
>>> \App\Models\User::where('name', 'Buraco')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> Illuminate/Database/Eloquent/ModelNotFoundException with message 'No query results for model [App/Models/User] 123b5545-5adc-4c59-9a27-00d035c1d212'
>>> \App\Models\User::where('name', 'John')->findOrFail('123b5545-5adc-4c59-9a27-00d035c1d212');
>>> App\Models\User
     id: "123b5545-5adc-4c59-9a27-00d035c1d212",
     name: "John",
     surname: "Graham",
     email: "[email protected]",
     email_verified_at: "2020-01-03 16:01:53",
     created_at: "2020-01-03 16:01:59",
     updated_at: "2020-01-03 16:01:59",
     deleted_at: null,

Verouderd:
Het duurde minstens twee uur om te beseffen dat als je de firstOrFail()-methode na where() in Laravel 5.6koppelt, het in feite probeert het eerste record van de tabel op te halen en waar-clausules verwijdert. Dus bel eerstOrFail voor waar.

Model::firstOrFail()->where('something', $value)

Antwoord 3, autoriteit 2%

## Or Via Scope For Multiple Rows ##
public function scopeGetOrFail ($query)
{
    if (empty($query->count())) {
        abort(404);
    } else {
        return $query->get();
    }
}
Page::whereSlug('about')->getOrFail();
Page::where("slug","about")->getOrFail();

Antwoord 4

Naar mijn mening kun je misschien de functie getRouteKeyName() definiëren om expliciet de gewenste kolom te nemen wanneer je static find() gebruikt voor een welsprekend model.

public function getRouteKeyName(){
  return 'slug';
}

En als je erop staat, kun je het als statische functie in het model schrijven

public  static function findBySlugOrFail($value){
  //get slug collection or return fail
  return Post::where('slug', '=', $value)->firstOrFail();
}

Antwoord 5

Probeer het als volgt:

Page::where('slug', '=', 'about')->get()

Other episodes