lukeboy_2002's avatar

Call to undefined method

Hello,

Maybe I'm doing it totally wrong. I have three models, Users, Members and Winners. All the Users are in one database and have a role of user, member or admin. In de Members database there are the information of a member. And in de Winners there is the latest winner.

Now I want to combine them.

In my User model

    public function member(): BelongsTo
    {
        return $this->belongsTo(Members::class);
    }

    public function winner(): BelongsTo
    {
        return $this->belongsTo(Winner::class);
    }

In my Member model:

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

    public function winner(): BelongsTo
    {
        return $this->belongsTo(Winner::class, 'user_id');
    }

And in my Winner model:

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

    public function member(): BelongsTo
    {
        return $this->belongsTo(Member::class);
    }

By members blade files are:

<div>
    <div class="border-l-4 border-orange-500 pl-4 flex justify-between items-center">
        <div class="text-orange-500 hover:text-orange-600 font-black uppercase focus:outline-none focus:text-orange-600">
            Member
        </div>
        {{ $members->links() }}
    </div>
    @foreach($members as $member)
        <div class="w-full bg-white border border-gray-200 shadow-md dark:bg-gray-800 dark:border-gray-700 my-4 p-4">
            <div class="flex space-x-8 pb-4 border-b border-orange-500">
                <img src="{{ $member->profile_picture}}" class="w-1/2 h-64 rounded-lg" alt="">
                <div class="pt-4 pr-4 w-full">
                    <div class="text-3xl text-orange-500 font-black uppercase">{{ $member->user->username }}</div>
                    <p class="text-orange-500 pb-4"> <i class="fa-solid fa-location-dot mr-2"></i> {{ $member->city }}</p>
                    <div class="relative">
                        <div class="absolute inset-0 flex items-center" aria-hidden="true">
                            <div class="w-full border-t border-gray-300"></div>
                        </div>
                    </div>
                    @if($member->birthday != null)
                    <div class="flex justify-between pt-4 pb-4">
                        <p class="text-gray-700 dark:text-white">Age: <span class="text-orange-500">{{ $member->age }}</span></p>
                        <p class="text-gray-700 dark:text-white">Birthday: <span class="text-orange-500">{{ $member->getBirthDate() }}</span></p>
                    </div>
                    @endif
                    <div class="flex justify-between pt-4 pb-4">
                        <p class="text-gray-700 dark:text-white">Points: <span class="text-orange-500">{{ $member->points }}</span></p>
                        <p class="text-gray-700 dark:text-white">Played games: <span class="text-orange-500">{{ $member->totalgames }}</span></p>
                    </div>
                </div>
            </div>
            <div class="p-6">
                <div class="text-2xl text-orange-500 font-black uppercase">Biography</div>
                <div class="text-gray-700 dark:text-white">
                    {!! $member->bio !!}
                </div>
            </div>
        </div>
    @endforeach
</div>

in my livewire component Members

    public function render()
    {
        return view('livewire.members', [
            'members' => Member::with('winner')->simplepaginate(1),
        ]);
    }

How to display the wins of a user. I tried a lot of given solutions on the internet but no one works. My latest line was

Cups: {{ $member->winner()->count() }}

0 likes
2 replies
LaryAI's avatar
Level 58

To display the wins of a user, you can use the withCount method to count the number of related records. In your render method, modify the query to include the count of wins for each member:

public function render()
{
    return view('livewire.members', [
        'members' => Member::with(['winner', 'user'])->withCount('winner')->simplepaginate(1),
    ]);
}

Then, in your blade file, you can access the count using the winner_count attribute:

Cups: {{ $member->winner_count }}
anilkumarthakur60's avatar

well for the Member model

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

    public function winner(): BelongsTo
    {
        return $this->belongsTo(Winner::class, 'user_id');
    }

you can return

  public function render()
    {
        return view('livewire.members', [
            'members' => Member::with(['user','winner'])->simplepaginate(1),
        ]);
    }
1 like

Please or to participate in this conversation.