Laravel 5.2 getNameOrUsername 方法无效
Laravel 5.2 getNameOrUsername method not working
我正在搜索数据,例如用户名。我通过使用像 <p>Jordan1</p>
这样的静态名称来实现它,但是当我想让它动态化时,就像让我的实际用户名反映在页面上一样,当我使用这种方法时它不起作用
{{ $user->getNameOrUsername() }}
在 return 中我得到这个错误:
BadMethodCallException in Builder.php line 2130:
Call to undefined method Illuminate\Database\Query\Builder::getNameOrUsername()
userblock.blade.php
<div class="media">
<a class="pull-left" href="#">
<img class="media-object" alt="{{ $user->getNameOrUsername() }}" src="">
</a>
<div class="media-body">
<h4 class="media-heading">
<a href="#">{{ $user->getNameOrUsername() }}</a>
</h4>
@if ($user->location)
<p>{{ $user->location }}</p>
@endif
</div>
</div>
results.blade.php
@include('layouts.--header')
<div class="container">
<h4>Your search for "{{ Request::input('query') }}"</h4>
@if (!$users->count())
<p> No results found, sorry.</p>
@else
<div class="row">
<div class="col-lg-12">
@foreach ($users as $user)
@include('search.userblock')
@endforeach
</div>
</div>
@endif
</div>
@include('layouts.--footer')
SearchController.php
<?php
namespace SCM\Http\Controllers;
use Illuminate\Http\Request;
use DB;
use SCM\User;
use Illuminate\Http\Requests;
class SearchController extends Controller
{
public function getResults(Request $request)
{
$query = $request->input('query');
if (!$query) {
return redirect ()->route('welcome');
}
$users = User::where(DB::raw("CONCAT(first_name, ' ', last_name)"), '
LIKE', "%{$query}%")
->orWhere('username', 'LIKE', "%{$query}%")
->get();
return view('search.results')->with('users', $users);
}
}
routes.php
<?php
/*
|--------------------------------------------------------------------------
| Routes File
|--------------------------------------------------------------------------
|
| Here is where you will register all of the routes in an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| This route group applies the "web" middleware group to every route
| it contains. The "web" middleware group is defined in your HTTP
| kernel and includes session state, CSRF protection, and more.
|
*/
Route::group(['middleware' => ['web']], function () {
Route::get('/login', function () {
return view('auth/login');
});
Route::get('/register', function () {
return view('auth/login');
});
});
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/', [
'as' => 'welcome', 'uses' => 'WelcomeController@index'
]);
Route::get('/profile', function () {
return view('layouts/-profile');
});
Route::get('profile/{username}', function () {
return view('layouts/-profile');
});
Route::get('settings/{username}', function () {
return view('layouts/-settings');
});
Route::get('/settings', function () {
return view('layouts/-settings');
});
Route::get('/home', 'HomeController@index');
});
/**
* Search
*/
Route::get('/search', [
'as' => 'search.results', 'uses' => 'SearchController@getResults'
]);
它正在寻找 User
模型上的 getNameOrUsername()
方法。您需要定义此方法。
仅供参考,如果它在您的 Model
上找不到该方法,它会在 Illuminate\Database\Eloquent\Builder
对象上查找它。如果它在那里找不到它,它会在 Illuminate\Database\Query\Builder
对象上寻找它。如果在那里找不到它,它会抛出异常。这就是为什么它是 Illuminate\Database\Query\Builder
上的 "BadMethodCallException"。
该方法未随 Laravel 一起提供。如果你想使用它,你需要创建它。我认为可以这样做:
用户模型
public function getNameOrUsername() {
return $this->name ? $this->name : $this->username;
}
然后在您的 blade 模板中使用它,例如
Hi {{ $user->getNameOrUsername() }}
我正在搜索数据,例如用户名。我通过使用像 <p>Jordan1</p>
这样的静态名称来实现它,但是当我想让它动态化时,就像让我的实际用户名反映在页面上一样,当我使用这种方法时它不起作用
{{ $user->getNameOrUsername() }}
在 return 中我得到这个错误:
BadMethodCallException in Builder.php line 2130:
Call to undefined method Illuminate\Database\Query\Builder::getNameOrUsername()
userblock.blade.php
<div class="media">
<a class="pull-left" href="#">
<img class="media-object" alt="{{ $user->getNameOrUsername() }}" src="">
</a>
<div class="media-body">
<h4 class="media-heading">
<a href="#">{{ $user->getNameOrUsername() }}</a>
</h4>
@if ($user->location)
<p>{{ $user->location }}</p>
@endif
</div>
</div>
results.blade.php
@include('layouts.--header')
<div class="container">
<h4>Your search for "{{ Request::input('query') }}"</h4>
@if (!$users->count())
<p> No results found, sorry.</p>
@else
<div class="row">
<div class="col-lg-12">
@foreach ($users as $user)
@include('search.userblock')
@endforeach
</div>
</div>
@endif
</div>
@include('layouts.--footer')
SearchController.php
<?php
namespace SCM\Http\Controllers;
use Illuminate\Http\Request;
use DB;
use SCM\User;
use Illuminate\Http\Requests;
class SearchController extends Controller
{
public function getResults(Request $request)
{
$query = $request->input('query');
if (!$query) {
return redirect ()->route('welcome');
}
$users = User::where(DB::raw("CONCAT(first_name, ' ', last_name)"), '
LIKE', "%{$query}%")
->orWhere('username', 'LIKE', "%{$query}%")
->get();
return view('search.results')->with('users', $users);
}
}
routes.php
<?php
/*
|--------------------------------------------------------------------------
| Routes File
|--------------------------------------------------------------------------
|
| Here is where you will register all of the routes in an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| This route group applies the "web" middleware group to every route
| it contains. The "web" middleware group is defined in your HTTP
| kernel and includes session state, CSRF protection, and more.
|
*/
Route::group(['middleware' => ['web']], function () {
Route::get('/login', function () {
return view('auth/login');
});
Route::get('/register', function () {
return view('auth/login');
});
});
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/', [
'as' => 'welcome', 'uses' => 'WelcomeController@index'
]);
Route::get('/profile', function () {
return view('layouts/-profile');
});
Route::get('profile/{username}', function () {
return view('layouts/-profile');
});
Route::get('settings/{username}', function () {
return view('layouts/-settings');
});
Route::get('/settings', function () {
return view('layouts/-settings');
});
Route::get('/home', 'HomeController@index');
});
/**
* Search
*/
Route::get('/search', [
'as' => 'search.results', 'uses' => 'SearchController@getResults'
]);
它正在寻找 User
模型上的 getNameOrUsername()
方法。您需要定义此方法。
仅供参考,如果它在您的 Model
上找不到该方法,它会在 Illuminate\Database\Eloquent\Builder
对象上查找它。如果它在那里找不到它,它会在 Illuminate\Database\Query\Builder
对象上寻找它。如果在那里找不到它,它会抛出异常。这就是为什么它是 Illuminate\Database\Query\Builder
上的 "BadMethodCallException"。
该方法未随 Laravel 一起提供。如果你想使用它,你需要创建它。我认为可以这样做:
用户模型
public function getNameOrUsername() {
return $this->name ? $this->name : $this->username;
}
然后在您的 blade 模板中使用它,例如
Hi {{ $user->getNameOrUsername() }}