Chopra
Chopra

Reputation: 571

Concatenate queries using Eloquent Builder

How can I concatenate queries using Eloquent Builder?

I am building queries based on criteria (where clause) and taking limit and offset from URL. These queries are then passed to ->get() method to fetch result. I want to do it using Eloquent and not Query builder.

Upvotes: 0

Views: 838

Answers (2)

Marcin Nabiałek
Marcin Nabiałek

Reputation: 111829

What you need is assigning result of functions again to the model.

You had:

if($params)
    {
        foreach($params['search'] as $param)
        {
            $this->model->where($param['where'],'=',$param['value']);
        }

        if (isset($params['start']))
        {
            $this->model->offset($params['start'] );
        }

        if(isset($params['count']))
        {
            $this->model->take($params['count']);
        }

        if (isset($params['sortColumn']))
        {
            $ascending = $params['ascending'] == 'true' ? 'ASC' : 'DESC';
            $this->model->orderBy($params['sortColumn'], $ascending);
        }

    }

$this->model->get();

and you need to use:

if($params)
    {
        foreach($params['search'] as $param)
        {
            $this->model = $this->model->where($param['where'],'=',$param['value']);
        }

        if (isset($params['start']))
        {
            $this->model = $this->model->offset($params['start'] );
        }

        if(isset($params['count']))
        {
            $this->model = $this->model->take($params['count']);
        }

        if (isset($params['sortColumn']))
        {
            $ascending = $params['ascending'] == 'true' ? 'ASC' : 'DESC';
            $this->model = $this->model->orderBy($params['sortColumn'], $ascending);
        }

    }

$data = $this->model->get();

Upvotes: 0

Ymartin
Ymartin

Reputation: 1361

This is how you build a query in eloquent(I have given an example of using multiple where clauses):

$result = ModelName::where('key_1', '=' , 'value_1')
                     ->where('key_2', '>', 'value_2')
                     ->take(4)
                     ->offset(2)
                     ->get()

The take() method will limit the number of results to 4 with offset 2.

http://laravel.com/docs/5.0/eloquent


Update

Based on OP's question over here https://laracasts.com/discuss/channels/general-discussion/eloquent-query-builder , I am updating my answer.

You could do something like this:

if($params)
{
    $query = $this->model;
    foreach($params['search'] as $param)
    {
        $query = $query->where($param['where'],'=',$param['value']);
    }

    if (isset($params['start']))
    {
        $query = $query->offset($params['start'] );
    }

    if(isset($params['count']))
    {
        $query = $query->take($params['count']);
    }

    if (isset($params['sortColumn']))
    {
        $ascending = $params['ascending'] == 'true' ? 'ASC' : 'DESC';
        $query = $query->orderBy($params['sortColumn'], $ascending);
    }

}

$query->get();

Upvotes: 1

Related Questions