Fokrule
Fokrule

Reputation: 854

How to use where condition in laravel eloquent

I am using laravel eloquent. I have fetched data from two table using eloquent. I have post table and chat table. For post table I have model Post.php and for chat table I have model Chat.php. Here is the the eloquent relation I have created to fetch chat for individual post for a user.

in Post.php

public function TeamMessage()
{
  return $this->hasMany('App\Chat','post_id');
}

And in Chat.php

public function ChatRelation()
{
    return $this->belongsTo('App\Post');
}

it is working perfect. But this relation fetch all messages for a specific post. I want to fetch all unread message from chat table. I have a column named unread in chat table. Now my question is how I can fetch only unread message for a specific post.

Upvotes: 0

Views: 167

Answers (4)

DevK
DevK

Reputation: 9962

While the other answers all work, they either depend on scopes (which are very useful in many circumstances) or on you having already instantiated an instance of $post, which doesn't let you eager load multiple posts with their messages.

The dynamic solution is this, which will let you fetch either 1 or more posts and eager load their messages with subquery:

$posts = Post::with(['TeamMessage' => function ($query) {
    $query->where('unread', true); // This part applies to the TeamMessage query
}])->get();

See in documentation

Edit:

If you, however, want to filter the posts, to only show those that have unread messages, you need to use whereHas instead of with:

$posts = Post::whereHas(['TeamMessage' => function ($query) {
    $query->where('unread', true); // This part applies to the TeamMessage query
}])->get();

More in the documentation.

You can also chain whereHas(...) with with(...).

Upvotes: 1

Jeff
Jeff

Reputation: 25221

First I would change your relation names to the name of the entity in lower case:

in Post.php

public function chats()
{
    return $this->hasMany('App\Chat','post_id');
}

And in Chat.php

public function post()
{
    return $this->belongsTo('App\Post');
}

public function scopeUnread($query)
{
    return $query->where('unread', 1);
}

Then you can use

$post->chats()->unread()->get();

Upvotes: 0

Joe
Joe

Reputation: 4738

You need to create a local scope on your model, information on local scopes can be found here: https://laravel.com/docs/5.6/eloquent#local-scopes

 public function scopeUnread($query)
{
    return $query->where('unread', 1);
}

Then in your controller/view

$unread = $yourmodel->unread()

Upvotes: 0

Phiter
Phiter

Reputation: 14982

For querying relationships, you have to call them as functions instead of properties, like this:

$unreadPosts = $post->TeamMessage()->where('unread', true)->get();

For more information on this you can take a look at the docs.

Upvotes: 0

Related Questions