Laravel getNameAttribute не работает с поиском - PullRequest
1 голос
/ 09 мая 2020

У меня модель Account, а внутри у меня такой метод:

public function getNameAttribute()
{
    if(\App::getLocale() == 'en')
        return $this->attributes['foreign_name'];
    else
        return $this->attributes['name'];
}

На странице индекса он работает. Если языковой стандарт en, имя будет foreign_name, как на этом рисунке:

enter image description here

Но у меня есть метод поиска, и это код:

public static function search_and_select($keyword)
{
    $keyword = Helper::clean_keyword($keyword);
    $data = Account::where
    ('number','like','%'.$keyword.'%')->
    orWhere('name','like','%'.$keyword.'%')->
    limit(30)->
    get(['user_id','number','name']);
    if(count($data) == 0)
        return Helper::no_result();
    return [$data,['number','name']];       
}

Если я попытаюсь найти что-нибудь, я получу эту ошибку:

message: "Undefined index: foreign_name"
    1: {,…}
class: "App\Models\Account"
file: "C:\xampp\htdocs\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php"
function: "getNameAttribute"
line: 465
type: "->"
2: {,…}
class: "Illuminate\Database\Eloquent\Model"
file: "C:\xampp\htdocs\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php"
function: "mutateAttribute"
line: 479
type: "->"

Но если я изменю:

return $this->attributes['foreign_name'];

на

return $this->attributes['id']; // or any integer field in the accounts table 

Работает без проблем.

С Laravel 6 у меня так работало, но теперь я получаю эту ошибку. Любая помощь здесь?

Это полный код модели:

namespace App\Models;
use Helper;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;
use Auth;
class Account extends Model
{
    use Notifiable,SoftDeletes;
    protected $table = 'accounts';
    protected $fillable = 
    [
        'number',
        'name',
        'foreign_name',
        'main_account_id',
        'user_id',
        'account_state_id',
        'note',
        'created_by','deleted_by'
    ];
    public function get_created_by()
    {
        return $this->belongsTo('App\Models\User','id','created_by');
    }
    public function get_deleted_by()
    {
        return $this->belongsTo('App\Models\User','id','deleted_by');
    }
    public function get_user_id()
    {
        return $this->hasOne('App\Models\User','id','user_id');
    }
    public static function search_scope($keyword)
    {
        $keyword = Helper::clean_keyword($keyword);
        $data = Account::where
        ('number','like','%'.$keyword.'%')->
        orWhere('name','like','%'.$keyword.'%')->
        limit(30)->
        get(['id','number','name']);
        if(count($data) == 0)
            return Helper::no_result();
        return [$data,['number','name']];
    }
    public static function search_and_select($keyword)
    {
        $keyword = Helper::clean_keyword($keyword);
        $data = Account::where
        ('number','like','%'.$keyword.'%')->
        orWhere('name','like','%'.$keyword.'%')->
        limit(30)->
        get(['user_id','number','name']);
        if(count($data) == 0)
            return Helper::no_result();
        return [$data,['number','name']];       
    }
    public function getNameAttribute()
    {
        if(\App::getLocale() == 'en')
            return $this->attributes['foreign_name'];
        else
            return $this->attributes['name'];
    }
}

это поиск и выберите html код

<search_and_select>
<div slot='search_and_select' slot-scope="{change_keyword,results,no_result,chose_data,keyword,hidden_id,chose_first_value}">
    <div class="container" style='width:40vw;'>
            <input class="form-control {{$search_and_select}}" type="text" @keyup='change_keyword($event.target.value,"{{$type}}")' @keyup.enter='chose_first_value()' v-model='keyword' :run="!keyword ? keyword = '{{$value}}' : true" {{$required ?? null}}>
            <input type='hidden' v-model='hidden_id' name='{{$search_and_select}}' :run="!hidden_id ? hidden_id = '{{$hidden_id}}' : true"/>
        <ul v-if='no_result' class="list-group">
            <li class="list-group-item">{{trans('language.no_result')}}</li>
        </ul>
        <ul v-if='results' class="list-group">
            <li v-for='result in results'><input class='results' @click='chose_data(result.id,result.number,result.name)' @keyup.enter='chose_data(result.id,result.number,result.name)'  type='text' :value='result.number+" "+result.name' /></li>
        </ul>
    </div>
</div>

и это включает файл

@include(
    'treats.create_search_and_select',
    [
        'search_and_select' => $search_and_selects[$key],
        'value' => $search_and_selects_values[$key],
        'hidden_id' => $search_and_selects_hidden_ids[$key],
        'type' => $search_and_selects_type[$key],
        'required' => $search_and_selects_requireds[$key],
        'language' => $search_and_selects_languages[$key],
        'hint' => $search_and_selects_hints[$key],
        'policy' => $search_and_selects_policies[$key],
        'show_type' => $search_and_selects_show_types[$key],
        'rank' => $search_and_selects_ranks[$key],
    ]
)

и это ошибки консоли enter image description here enter image description here, и вот как я вызываю search_and_select

public function search_and_select(Request $request)
{
    if(!Gate::allows($request['model'].'.view'))
        return Helper::not_auth();
    $model = Model::where('name',$request['model'])->firstOrFail();
    $model_name = '\App\Models\\'.$model['model'];
    $data = $model_name::search_and_select($request['keyword']);
    return $data;
}

1 Ответ

1 голос
/ 18 мая 2020

Это из-за вашей строки

get(['user_id','number','name'])

, которая просит получить только эти столбцы. Вам нужно добавить foreign_name к этому массиву и сделать его

get(['user_id','number','name', 'foreign_name'])

Согласно Laravel ссылке , функция get принимает список столбцов.

То же самое касается других функций

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