I know it is possible and maybe I had already done it, I need to refresh my memory. Let say we have one-to-many
$post->comments
and I want Comments on this post where comment date is greater than specific date. I don't want to get this specific date in php value. Because I want to use it as generic column name.
$myComments = $post->comments->where('published', '>=', 'posts.updated_at');
I do someething like but I am getting
Column not found
thanks
You've got 3 problems here:
First, $post->comments
is a Collection
, and does not use SQL at all, so posts.updated_at
will not be available, but $post->updated_at
would be.
Second, Relationships don't use joins
, so posts.updated_at
is not going to be available unless you manually join it.
Third, ->where()
is a string
match, so your query is literally WHERE published = 'projects.updated_at'
, which will return 0
results. You'd need to use ->whereColumn()
there.
You can solve this by "Eager Loading" Comments with that where()
clause:
$post = Post::with(['comments' => function ($query) {
return $query->select('comments.*')
->join('posts', 'comments.post_id', '=', 'posts.id')
->whereColumn('comments.published', '>=', 'posts.updated_at');
})->first();
// Or `$posts = Post::with([ /* ... */ ])->get();
Or keep the ->comments
syntax, but pass the attribute, not the SQL field:
$myComments = $post->comments->where('published', '>=', $post->updated_at)
Or, finally, use ->comments()
with the same syntax as Eager Loading:
$myComments = $post->comments()
->select('comments.*')
->join('posts', 'comments.post_id', '=', 'posts.id')
->whereColumn('comments.published', '>=', 'posts.updated_at')
->get();