0

这适用于单个名称...

Result::whereIn('id', $log->result_ids)
      ->select('*')
      ->selectRaw("(owner LIKE ? ) + 
                   (owner LIKE ? ) + 
                   (city LIKE ? ) AS score", 
                   ['%CHARLOTTE%', '%RICHARD%', 'Salem'])
      ->get();

但我想动态使用一系列所有者、城市等......

$owners = [ 
     'CHARLOTTE', 
     'RICHARD'
     // ... or more 
];
$cities = [ 
     'SALEM', 
     'PORTLAND'
     // ... or more 
];

Result::whereIn('id', $log->result_ids)
      ->select('*')
      ->selectRaw("(owner LIKE ? ) + 
                   (city LIKE ? ) AS score", 
                   [$owners, $cities])
      ->get();

@Mehmet Bütün,这是我修改后的答案,它确实有效。有没有更清洁的方法?

$spouses = ['Patricia', 'Cindy'];
$cities  = ['Riverside', 'San Diego'];

$string_to_spouse_score = collect($spouses)->map( function($spouse) {
      return "(owner LIKE '%".strtoupper($spouse)."%' )";
})->join(' + ') . " as spouse_score";

$cities_string = collect($cities)->map( function($city) {
      return strtoupper($city);
})->join(' OR city LIKE ');

Result::whereIn('id', $result_ids)->select('*')
      ->selectRaw("(owner LIKE ? ) as owner_score", ['%'.strtoupper($owner->first_name).'%'])
      ->selectRaw($string_to_spouse_score) // as spouse_score
      ->selectRaw("(city LIKE ? ) as city_score", [$cities_string])
      ->selectRaw("(SELECT(owner_score)) + (SELECT(spouse_score)) + (SELECT(city_score)) as score")
      ->having('score', '>', 0)
      ->orderBy('score', 'desc')
      ->get(); 
4

1 回答 1

0

您正在尝试使用array而不是string. 试试这个(我希望它会工作):

$owners = [ 
     'CHARLOTTE', 
     'RICHARD'
     // ... or more 
];
$cities = [ 
     'SALEM', 
     'PORTLAND'
     // ... or more 
];


$new_owners=array();
foreach ($owners as $owner){
    $new_owners[]='%'.$owner.'%';
}
$owners_query_string= implode(' OR owner LIKE ', $new_owners);


$new_cities=array();
foreach ($cities as $city){
    $new_cities[]='%'.$city.'%';
}
$cities_query_string= implode(' OR city LIKE ', $new_cities);

Result::whereIn('id', $log->result_ids)
      ->select('*')
      ->selectRaw("(owner LIKE ? ) + 
                   (city LIKE ? ) AS score", 
                   [$owners_query_string, $cities_query_string])
      ->get();
于 2020-08-09T14:34:42.740 回答