Модель имеет 3 поля, которые являются атрибутами модели, а 4-е поле — это динамическое поле, которое называется «fullTitle».
[
{
"id": 1,
"hours": 2000,
"car_id": 3,
"fullTitle": "Test",
}
}
<?php
namespace App;
use App\Car;
class VenderModel extends Model
{
use TranslationTrait;
protected $guarded = ['*'];
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = [
'fullTitle'
];
/**
* Accessor for dynamic property fullTitle to use as selector name.
* @param string $locale
* @return null|string|string[]
*/
public function getFullTitleAttribute($locale = 'es')
{
if (null === $this->hasTranslation()) {
return trans('errors.No name');
}
return preg_replace('/\s{2,}/', ' ', $this->code.' '. $this->translationOrFirst($locale)->translation);
}
}
public function index(Request $request): JsonResponse
{
$limit = $request->input('limit', 25);
$title = $request->input('title');
$query = VenderModel::all();
$query->when($request->query('title'), function ($q) use ($title) {
return $q->where('fullTitle', 'like', '%' . $title . '%');
});
return response()->json($query, 200);
}
Я пытаюсь подобрать элементы с полным заголовком, но не работает.
Вы получаете ошибку? Если да, то предоставьте его нам.
@Tarasovych это не поле БД, это динамическое поле
Итак, вам нужно «вычислить» fullTitle все объекты, которые вы хотите отфильтровать.






$collection = VenderModel::get();
$collection->filter(function($item) use($title) {
return preg_match('/.*'.$title.'.*/', $item->fullTitle) !== false;
});
return response()->json($collection, 200);
Я думаю, что это должно решить это. Вы не можете использовать запрос к полю, которое на самом деле не является полем в вашей таблице, но вы должны иметь возможность фильтровать его как коллекцию.
Примечание: это решение плохо масштабируется при больших объемах данных. Если вы хотите, чтобы он масштабировался, вам в основном нужно хранить переводы в другой таблице и использовать соединения, но если у вас будет около 100 записей, это не имеет значения.
Вы не можете попросить свою базу данных искать что-то, чего на самом деле нет в таблице.
Пользовательские атрибуты вызываются только тогда, когда вы запрашиваете производное свойство. Их нельзя использовать в запросе.
В качестве альтернативы вы можете захватить ВСЕ строки в памяти, а затем отфильтровать их с помощью PHP, но это не очень хороший способ.
Также вы можете подумать о сохранении перевода определенного свойства в связанной таблице, а затем выполнять поиск в базе данных по отношению.
fullTitleне является полем БД, верно?