Mr. Kenneth
Mr. Kenneth

Reputation: 934

Laravel - Group multiple where clause as orWhere

Is it possible to append multiple where clause and make them orWhere clause?

This is what I mean:

public function call() 
{
    $pageTypes = ["page_user", "guest_user" ...etc];
    $appendQuery = [];

    // in here, the query is always where making the sql query "page_type LIKE %page_user% and page_type LIKE %guest_user%"
    // my written mysql query here might be written wrong but I hope you get the idea.
    // I want to change the subsequent query to orWhere
    foreach ($pageTypes as $i => $pageType) {
        array_push($appendQuery, function ($query) use ($pageType) {
            return $this->addPageTypeQuery($query, $pageType);
        });
    }

}

public function addPageTypeQuery($query, $pageType)
{
    return $query->where('page_type', 'LIKE', $pageType);
}

Though I can manually create a function with query where・orWhere, but if there is a laravel/php way to do this, that would help.

Note I am unable to change the contents of addPageTypeQuery function. I know I can add an input parameter inside then create an ifelse/switch statement to determine what the desired return data but I cannot do so since my PM will not allow it.

Extra note I forgot I can use whereIn but currently there is no whereIn function in the current repository.php file I am working and I cannot add/edit functions because of PM. I might create my own function of whereIn clause or hack the appenedQuery and manually change the where to orWhere (Bad practice) Too complicated. Will create a whereIn instead.

Upvotes: 0

Views: 113

Answers (1)

IGP
IGP

Reputation: 15889

orWhere() just uses where() in the background so you should be able to do it. The signature for the where method is

public function where($column, $operator = null, $value = null, $boolean = 'and')
{
    ...
}

orWhere is pretty similar

public function orWhere($column, $operator = null, $value = null)
{
    ...
    return $this->where($column, $operator, $value, 'or');
}

With this in mind, I think you only need a way to pass an extra argument to your addPageTypeQuery method.

public function addPageTypeQuery($query, $pageType, $boolean = 'and')
{
    return $query->where('page_type', 'LIKE', $pageType, $boolean);
}
foreach ($pageTypes as $i => $pageType) {
    array_push($appendQuery, function ($query) use ($pageType) {
        if (/* should be an OR query */) {
            return $this->addPageTypeQuery($query, $pageType, 'or');
        }

        return $this->addPageTypeQuery($query, $pageType);
    });
}

Upvotes: 0

Related Questions