Laravel set an Automatic WHERE Clause

I use models that extend a generic_model, which in turn extends Eloquent (so that I have several crud methods I use already set to be inherited).

A lot of the tables I use invoke soft delete, which needs a WHERE clause of…

WHERE deleted = 0

Is there a way to make Laravel behave in such a way that this WHERE clause is automatically included in all queries and all queries to objects that are related to one another?

e.g.

pages where id = 5 and deleted = 0

and then…
images where page_id = 5 and deleted = 0

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

if you’re using laravel 3 this is what you needs

on your model

public function query()
{

    $query = parent::query();

    $query->where('deleted','=','0');

    return $query;
}

if you’re using laravel 4 just change the method query for newQuery
public function newQuery()
{

    $query = parent::newQuery();

    $query->where('deleted','=','0');

    return $query;
}

reference

Method 2

In relationships you can add the where_clause in your return:

 public function pages()
{
    return $this->has_many('Page')->where_deleted(0);
}

In your Model, you could add something like:
public static function active()
{
    return self::where_delete(0)->get();
}

to use Page::active() instead of Page::all()
(Or you can remove the ->get() from the function in the model, so you can still further modify your query (Page::active()->order_by('name'))


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x