【问题标题】:Method Chaining based on condition基于条件的方法链
【发布时间】:2020-02-20 17:44:59
【问题描述】:

如何在 laravel 4 中根据条件进行方法链接?假设一个值不为假,那么里面的方法将链接到 if 语句之前调用的方法。

在 laravel 中可以吗?

$data = User::where('username', $somevariable );

if(isset( $somevar_again ))
{
  $data->where('age', 21);
}
$data->orderBy('reg_date', 'DESC')->get();
return $data->first();

// 尝试了上面的代码,它给了我错误的结果 在codeigniter中我可以做到这一点

$this->db->select('e.*, v.name_en as v_name_en')
    ->from($this->table_name . ' e, ' . $this->ptc_venues . ' v');
  $this->db->where('e.venue_id_en = v.id'); 

  if(isset($search)){
   $this->db->where('(v.name_en LIKE "%'.$search.'%")');
  }

  $this->db->limit($limit, $start);
  $this->db->order_by('e.added_date_en', 'DESC');

【问题讨论】:

  • 您正在调用get(),它返回所有结果,然后调用first(),它基本上将LIMIT 1 添加到生成的SQL 查询并运行它。你为什么打电话给->get()
  • 几乎相关的页面:stackoverflow.com/q/12351737/2943403

标签: php laravel laravel-4


【解决方案1】:

我相信您的问题发生是因为您没有在每次查询构建器方法调用后存储回结果查询。

$query = User::query();

// Checking for username if exists
if (!empty($username)) {
    $query = $query->where('username', $username);
}

// Check for age if exists
if (isset($age)) {
    $query = $query->where('age', $age);
}

// Ordering
$query = $query->orderBy('reg_date', 'DESC');

// Get the first result
// After this call, it is now an Eloquent model
$user = $query->first();

var_dump($user);

【讨论】:

    【解决方案2】:

    从 Laravel 5.2 起,你可以使用Conditional Clauses/Statements

    有时您可能希望语句仅在以下情况下应用于查询 别的东西是真的。例如,您可能只想申请一个 如果传入的输入值存在给定的输入值,则声明 要求。您可以使用when 方法完成此操作

    when 方法只在第一个参数为真时执行给定的闭包。如果第一个参数为false,则不会执行闭包

    您可以使用如下代码:

    $data = User::where('username', $somevariable)
                  ->when( isset($somevar_again), function ($query) {
                          return $query->where('age', 21);
                       })
                  ->orderBy('reg_date', 'DESC')
                  ->get();
    return $data->first();
    

    另外,请注意Laravel 5.3+,它已进一步扩展,如下所述:

    您可以将另一个闭包作为第三个参数传递给when 方法。 如果第一个参数计算为 错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 2017-11-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多