Использование функции модели - PullRequest
0 голосов
/ 24 сентября 2019

У меня Category Модель, как показано ниже

class Category extends Model
{    
    public function users(){
        return $this->hasMany(User::class)->where("active_status",1)->where("user_type", 'user');
    }
}

У меня есть User Модель, как показано ниже

class User extends Authenticatable
{
    public function getFullName()
    {
        return $this->first_name.' '.$this->middle_name.' '.$this->last_name;
    }
}

Мой код контроллера похож на ниже

$category = Category::join('users', 'users.category_id', '=', 'categories.id')->get(); 

Я пытаюсь использовать приведенный ниже код в view

@foreach( $result as $spc )

  $spc->getFullName();

@endforeach

Я получаю сообщение об ошибке, как показано ниже

[2019-09-24 14:45:43] laravel.ERROR: Call to undefined method App\Category::getFullName()

1 Ответ

3 голосов
/ 24 сентября 2019

Следуя комментариям, лучший способ достичь своей цели - правильно использовать Красноречивые отношения

Так что в вашем контроллере измените ваш запрос с

$category = Category::join('users', 'users.category_id', '=', 'categories.id')->get();

to

$categories = Category::with('users')->get();

Теперь результатом будет коллекция Category с нетерпеливо загруженным отношением users, что-то вроде:

[
  {"id": 1, "name": "My category 1", "users": [{"id": 1, "mail": "user1@example.com"}, {"id": 2, "mail": "user2@example.com"}]},
  {"id": 2, "name": "My category 2", "users": []},
  {"id": 3, "name": "My category 3", "users": [{"id": 7, "mail": "user7@example.com"}]},
]

на ваш взгляд с простым foreach Вы можете перебирать категории и каждого пользователя:

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Users</th>
        </tr>
    </thead>
    <tbody>
        @foreach($categories as $category)
        <tr>
            <td>
                {{ $category->id }}
            </td>
            <td>
                {{ $category->name }}
            </td>
            <td>
                <ul>
                    @foreach($category->users as $user)
                    <li>
                        {{ $user->getFullName()}}
                    </li>
                    @endforeach
                </ul>
            </td>
        </tr>
        @endforeach
    </tbody>
</table>

Примечание

Я видел, что ваше отношение объявлено как

public function users(){
    return $this->hasMany(User::class)->where("active_status",1)->where("user_type", 'user');
}

Мне не очень нравитсямного, чтобы добавить все эти where внутри объявления отношения.Я думаю, что лучше использовать локальные области , поскольку этот код может использоваться в других частях вашего кода.

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