Php Laravel在过滤具有给定值的列时追加JSON对象

Php Laravel在过滤具有给定值的列时追加JSON对象,php,json,laravel,eloquent,Php,Json,Laravel,Eloquent,我正在尝试创建一个搜索栏,以允许用户: (1) 使用给定值筛选两个表 (2) 并在每个“行”内附加一个“状态”列 我做了如下第一部分: public function getFilterBooks($input) { $books = DB::table('books') ->join('categories', 'books.cat_id', '=', 'categories.id') ->where('b_name', 'LIKE', '%' . $inp

我正在尝试创建一个搜索栏,以允许用户:

(1) 使用给定值筛选两个表

(2) 并在每个“行”内附加一个“状态”列

我做了如下第一部分:

public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
 }

return Response::json($books);
JSON结果返回良好:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
  }
 ]
但是,我想在这里添加一些逻辑属性,例如当b_作者名称等于登录用户fullname时,然后将状态显示为true,否则false

类似这样的事情:(显然这行不通)

Add应该显示如下内容:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
    "status" : true
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
    "status" : false
  }
 ]
public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->select(
        ['*', DB::raw('books.b_author = :username as status')], 
        [Auth::user()->fullname]
    )
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
}

return Response::json($books);
$books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where(function ($clause) {
        $clause->where('b_name', 'LIKE', '%' . $input . '%')
            ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    })
    ->where('b_author', Auth::id())
    ->get();

因此,根据登录用户的不同,JSON结果返回的结果也不同

我想最简单的方法是在数据库中添加select子句,如下所示:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
    "status" : true
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
    "status" : false
  }
 ]
public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->select(
        ['*', DB::raw('books.b_author = :username as status')], 
        [Auth::user()->fullname]
    )
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
}

return Response::json($books);
$books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where(function ($clause) {
        $clause->where('b_name', 'LIKE', '%' . $input . '%')
            ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    })
    ->where('b_author', Auth::id())
    ->get();
Auth::user()->fullname
放在一个单独的数组中的原因是,即使它在
DB::raw()
查询中使用,我们也希望正确地转义它。由于您需要所有常规列,因此我们也将
'*'
添加到select数组中

编辑:按要求解释:

当我们在SQL中选择x=y作为z…时,我们将x与y进行比较,如果它们相等,则将z设置为1,如果它们不相等,则将z设置为0

因此,在
books.b_author=:username as status
中,我们说的是“将表books中的b_author列与值:username进行比较”。但是
:username
只是我们稍后插入的值的占位符。这就是我们在第二个数组中所做的,
[Auth::user()->fullname]
-我们用登录用户的fullname值替换
:username


这样,您就可以直接在查询中进行比较,而无需在php中处理结果数组。

我认为最简单的方法是在数据库中进行比较,并添加select子句,如下所示:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
    "status" : true
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
    "status" : false
  }
 ]
public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->select(
        ['*', DB::raw('books.b_author = :username as status')], 
        [Auth::user()->fullname]
    )
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
}

return Response::json($books);
$books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where(function ($clause) {
        $clause->where('b_name', 'LIKE', '%' . $input . '%')
            ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    })
    ->where('b_author', Auth::id())
    ->get();
Auth::user()->fullname
放在一个单独的数组中的原因是,即使它在
DB::raw()
查询中使用,我们也希望正确地转义它。由于您需要所有常规列,因此我们也将
'*'
添加到select数组中

编辑:按要求解释:

当我们在SQL中选择x=y作为z…时,我们将x与y进行比较,如果它们相等,则将z设置为1,如果它们不相等,则将z设置为0

因此,在
books.b_author=:username as status
中,我们说的是“将表books中的b_author列与值:username进行比较”。但是
:username
只是我们稍后插入的值的占位符。这就是我们在第二个数组中所做的,
[Auth::user()->fullname]
-我们用登录用户的fullname值替换
:username


这样,您可以直接在查询中进行比较,而无需在php中处理结果数组。

我认为这可以通过雄辩的模型解决,请看一下我在项目中使用的解决方案

为了简单起见,我只重写了
toArray()
方法

例如:

class Example extends \Eloquent {
    //...
    public function toArray(){
        $array = parent::toArray();
        $array['status'] = ($array['b_author'] == Auth::user()->fullname)?true:false; 
        //just updating to required attribute result
        return $array;
    }
}
每当我使用以下方法调用此模型时:

Example::all()->toArray()
它将自动向数组的所有元素添加一个元素

更新

处理模型中逻辑属性的另一种方法:

为了强制在数组中返回属性,请将其作为键添加到$attributes数组中

class User extends Eloquent {
    protected $attributes = array(
        'status' => '',
    );

    public function getStatusCode()
    {
        return ....
    }
}
更新-1

根据第5.1条

class User extends Eloquent {
 protected $appends = array('status');

    public function getStatusAttribute() {
      return 'someStatus';
   }
}

如果您仍然面临一些困惑,请让我知道。

我认为这可以通过雄辩的模型来解决,请看看我在项目中使用的解决方案

为了简单起见,我只重写了
toArray()
方法

例如:

class Example extends \Eloquent {
    //...
    public function toArray(){
        $array = parent::toArray();
        $array['status'] = ($array['b_author'] == Auth::user()->fullname)?true:false; 
        //just updating to required attribute result
        return $array;
    }
}
每当我使用以下方法调用此模型时:

Example::all()->toArray()
它将自动向数组的所有元素添加一个元素

更新

处理模型中逻辑属性的另一种方法:

为了强制在数组中返回属性,请将其作为键添加到$attributes数组中

class User extends Eloquent {
    protected $attributes = array(
        'status' => '',
    );

    public function getStatusCode()
    {
        return ....
    }
}
更新-1

根据第5.1条

class User extends Eloquent {
 protected $appends = array('status');

    public function getStatusAttribute() {
      return 'someStatus';
   }
}

如果您仍然面临一些困惑,请告诉我。

如果您根本不使用其他成员的帖子,您的查询是错误的。应该是这样的:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
    "status" : true
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
    "status" : false
  }
 ]
public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->select(
        ['*', DB::raw('books.b_author = :username as status')], 
        [Auth::user()->fullname]
    )
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
}

return Response::json($books);
$books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where(function ($clause) {
        $clause->where('b_name', 'LIKE', '%' . $input . '%')
            ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    })
    ->where('b_author', Auth::id())
    ->get();
如果您确实使用它们,请将以下两段代码添加到您的模型中:

protected $appends = [ 'status' ];
-


如果你根本不使用其他成员的帖子,你的查询就错了。应该是这样的:

[ { "id" : 1,
    "b_name" : "foo Name",
    "b_author" : "bar author",
    "cat_name" : "foobar cat",
    "status" : true
  },
  { "id" : 2,
    "b_name" : "foo Name2",
    "b_author" : "bar author2",
    "cat_name" : "foobar cat2",
    "status" : false
  }
 ]
public function getFilterBooks($input)
{
    $books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->select(
        ['*', DB::raw('books.b_author = :username as status')], 
        [Auth::user()->fullname]
    )
    ->where('b_name', 'LIKE', '%' . $input . '%')
    ->orWhere('b_author', 'LIKE', '%' . $input . '%')
    ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    ->get();
}

return Response::json($books);
$books = DB::table('books')
    ->join('categories', 'books.cat_id', '=', 'categories.id')
    ->where(function ($clause) {
        $clause->where('b_name', 'LIKE', '%' . $input . '%')
            ->orWhere('cat_name', 'LIKE', '%' . $input . '%')
    })
    ->where('b_author', Auth::id())
    ->get();
如果您确实使用它们,请将以下两段代码添加到您的模型中:

protected $appends = [ 'status' ];
-


我认为最好的方法是在转换成json之前循环每个元素,向结果中添加另一个元素而不是_array@SafoorSafdar你能举个例子吗?@kamlesh.bar你能举个例子吗?@RobertM.Tijerina请看一下我的答案。我认为最好的方法是在转换为json之前循环每个元素,向结果中添加另一个元素。你可以先使用数组函数:array\u column($books,'b_author')和_array@SafoorSafdar你能举个例子吗?@kamlesh.bar你能举个例子吗?@RobertM.Tijerina请看一下我的答案。你能解释一下
DB::raw('books.b_author=:username as status')]
这里?什么是
=:username
?它给了我:
SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数
错误,但它可以与
DB::raw('books.b_author='.Auth::user()->全名。'as status')
啊,对了,我已经有一段时间没有这样做了…试着用
替换
:username
。。如果这不起作用,查询中还有其他东西会混淆参数绑定。好吧,查询中还有其他东西会弄乱它。我已经尝试过了