Laravel Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: privilege () - PullRequest
0 голосов
/ 05 мая 2019

Я хотел бы отобразить privileges('name') вместо idPrivilege в пользовательской коллекции.Я пытался добавить отношение и использовать его в вызове Eloquent, но получаю сообщение об ошибке.

Модель пользователя

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $table = 'users';

    protected $primaryKey = 'idUser';

    protected $fillable = [
        'name', 'email',
    ];

    protected $hidden = [
        'password', 'updated_at',
    ];

    public function privilege()
    {
        return $this->hasOne(Privilege::class, 'idPrivilege', 'idPrivilege');
    }
}

Модель привилегий

namespace App;

use Illuminate\Database\Eloquent\Model;

class Privilege extends Model
{
    protected $table = 'privileges';

    protected $primaryKey = 'idPrivilege';

    protected $fillable = [
        'name',
    ];

    protected $hidden = [
        'updated_at', 
    ];

    public function user()
    {
        return $this->belongsTo(User::class, 'idPrivilege', 'idPrivilege');
    }
}

UserController

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
    public function relationTest()
    {
        return User::where('idUser', 1)->privilege()->get();
    }
}

При использовании with('privilege') в мою коллекцию пользователей добавляется коллекция привилегий.

Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: privilege ().

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Я могу добиться этого, используя ресурс:

$user = User::where('idUser', 1)->with('privilege')->first();
return UserResource::make($user);

Внутри UserResource:

public function toArray($request)
{
    return [
        'idUser' => $this->idUser,
        'name' => $this->name,
        'email' => $this->email,
        'privilege' => $this->privilege['name'],
        'createdAt' => $this->created_at,
    ];
}

но надеялся, что есть более простой способ получить это.

выход:

{
"data": {
"idUser": 1,
"name": "Martin",
"email": "martin@martin.martin",
"privilege": "user",
"createdAt": "2019-05-05T01:11:43.000000Z"
}
}
0 голосов
/ 05 мая 2019

where возвращает экземпляр Builder, для которого метод privilege не существует, поэтому вы можете просто использовать его следующим образом:

return User::find(1)->privilege()->get();;

- РЕДАКТИРОВАТЬ

User::find(1)->with(['privilege' => function($query) { 
   $query->select('name');
}])->get();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...