Как получить данные при использовании first () эквивалента в модели Laravel? - PullRequest
0 голосов
/ 11 января 2019

Я использую Laravel версии 5.7 и хочу получить данные из базы данных. Я попытался использовать $genre->name, но это не сработало, а также я попытался $genre->toArray(), но получил еще одну ошибку.

Контроллер

<?php

namespace App\Http\Controllers;

use App\genre;

class Mins extends Controller
{
    public function genget($data)
    {
        foreach ($data as $key => $value) {
            $genre = genre::where('name', $value)->first();
            echo $genre->name;
        }
    }
}

Вот данные в $data, когда я var_dump.

array(4) { [0]=> string(6) "Comedy" [1]=> string(3) 
    "Action" [2]=> string(8) "Bad" [3]=> string(7) "Good" } 

Я получаю следующую ошибку (эхо в контроллере):

«Попытка получить свойство name для необъекта»

Однако, когда я пытаюсь сделать dd($genre->name) в контроллере, я получил данные.

Модель

namespace App;

use Illuminate\Database\Eloquent\Model;  

class genre extends Model  
{
      protected $fillable = ['name', 'slug'];
}

Я тоже пытаюсь:

$genre = genre::where('name', $value)->first()->toArray();
dd($genre);

Ответ:

array:6 [▼
  "id" => 1
  "name" => "Comedy"
  "slug" => "comedy"
  "created_at" => "2019-01-11 15:02:31"
  "updated_at" => "2019-01-11 15:02:31"
  "deleted_at" => null
]

Но когда я вызываю указанное значение типа echo $g['name'];, я получаю ошибку:

«Вызов функции-члена toArray () при нулевом значении»

Я пытаюсь изменить $value, используя строку вроде:

$genre = genre::where('name', 'Comedy')->first();

Это отлично работает, кто-нибудь знает в чем проблема?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Во-первых, с помощью кода в вашем примере, я бы предложил проверить, существует ли модель на самом деле, прежде чем что-либо с ней делать, таким образом, вы не получите ошибку, когда она не существует. При использовании first() он либо возвращает модель Eloquent, либо null, поэтому простая проверка будет выглядеть примерно так:

$genre = genre::where('name', $value)->first();

if ($genre) {
   echo $genre->name; 
}

При этом выполнение запроса внутри цикла довольно неэффективно и считается плохой практикой. В этом случае вам лучше использовать whereIn () , а затем просматривать результаты:

public function genget($data)
{
    $genres = genre::whereIn('name', $data)->get();

    foreach ($genres as $genre) {
        echo $genre->name;
    }
}

Таким образом, вы выполняете только один запрос (вместо 4, как в вашем примере), и вам не придется беспокоиться о том, что они существуют, когда вы их просматриваете.


NB

Это не существенно, но я настоятельно рекомендую следовать PSR, особенно в этом случае PSR-1 - Имена пространств имен и классов , поэтому вы genre класс должны быть Genre например

объявление класса : class Genre (не class genre)

имя файла класса : Genre.php (не genre.php)

использование класса : Genre::someMethod() (genre::someMethod())

0 голосов
/ 11 января 2019

Проверить пустой результат:

foreach ($data as $key => $value)
{
    $genre = genre::where('name', $value)->first(); 

    if ($genre)
    {
        echo $genre->name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...