BelongsTo

Вы просматриваете документацию старой версии MoonShine. Рассмотрите возможность обновления вашего проекта до MoonShine 2.x.

Наследует Select * имеет те же возможности

# Основы

Поле для отношений в Laravel типа BelongsTo. Отображается как поле select.

use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
// с указанием отношения
BelongsTo::make('Country', 'country', 'name')
// или можно поле
BelongsTo::make('Country', 'country_id', 'name')
];
}
//...

Третий аргумент со значением "name" является полем в связанной таблице countries для отображения значений.

Также третьим параметром можно передать ресурс, у которого указано поле для отображения.

use MoonShine\Fields\BelongsTo;
use App\MoonShine\Resources\CountryResource;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Country', 'country', new CountryResource())
];
}
//...
namespace App\MoonShine\Resources;
 
use MoonShine\Resources\Resource;
use App\Models\Country;
 
class CountryResource extends Resource
{
//...
 
public string $titleField = 'name';
 
//...
}

Если необходимо более сложное значение для отображения, то в третий аргумент можно передать функцию.

use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
BelongsTo::make(
'Country',
'country',
fn($item) => "$item->id.) $item->name"
)
];
}
//...

# Поиск значений

Если необходим поиск среди значений, то нужно добавить метод searchable().

use MoonShine\Fields\BelongsTo;
use App\MoonShine\Resources\CountryResource;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Country', 'country', new CountryResource())
->searchable()
];
}
//...

Для реализации асинхронного поиска значений воспользуйтесь методом asyncSearch().

use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Contacts')
->asyncSearch()
];
}
//...

Поиск будет осуществляться по полю отношения ресурса titleField. По умолчанию titleField=id.

В метод asyncSearch() можно передавать параметры:

  • title - поле по которому происходит поиск
  • count - количество элементов в выдаче
  • asyncSearchQuery() - callback-функция для фильтрации значений
  • asyncSearchValueCallback() - callback-функция для кастомизации вывода.

use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Contacts')->asyncSearch(
'title',
10,
asyncSearchQuery: function (Builder $query) {
return $query->where('id', '!=', 2);
},
asyncSearchValueCallback: function ($contact) {
return $contact->id . ' | ' . $contact->title;
}
)
];
}
//...

При построении запроса в asyncSearchQuery() можно использовать текущие значения формы. Для этого необходимо передать Request в callback-функции.

use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use MoonShine\Fields\BelongsTo;
use MoonShine\Fields\Select;
 
//...
public function fields(): array
{
return [
Select::make('Country', 'country_id'),
BelongsTo::make('City')->asyncSearch(
'title',
asyncSearchQuery: function (Builder $query, Request $request): Builder {
return $query->where('country_id', $request->get('country_id'));
}
)
];
}
//...

Отношения, которые применяют в своих полях асинхронный поиск, рекомендуется использовать в режиме ResourceMode.

# Запрос для значений

Для фильтрации значений воспользуйтесь методом valuesQuery

use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Categories', 'categories', 'name')
->valuesQuery(fn(Builder $query) => $query->where('active', true))
];
}
//...

# Пустое значение

Если необходимо по умолчанию значение Null

use MoonShine\Fields\BelongsTo;
 
//...
public function fields(): array
{
return [
BelongsTo::make('Country', 'country')
->nullable()
];
}
//...

Не забудьте также в таблице базы данных указать, что поле может быть Null.