#php #orm #relational-database #silverstripe #silverstripe-4
Вопрос:
Я пытаюсь извлечь название проекта из таблицы Сведений о проекте, получаются данные и сохраняется идентификатор проекта в таблице временной шкалы, но я не могу указать название продукта в полях сводки, если у кого-нибудь есть решение, пожалуйста, помогите мне . Заранее спасибо.!
есть ли какие-либо синтаксические проблемы в этих кодах? как будто у многих, у одного , у многих много ?
Это мои коды
ProjectTimeline.php
class ProjectTimeline extends DataObject {
private static $table_name = 'ProjectTimeline';
private static $db = [
'Title' => "Varchar(255)",
'ProjectId' => "Varchar(255)"
];
private static $has_one = [
'ProjectPage' => ProjectPage::class
];
private static $has_many =[
'ProjectDetails'=>ProjectDetails::class
];
/**
* Data Listing Fields
*/
private static $summary_fields = [
'ProjectDetails.ProjectName' => 'Project Name',
'Title' => 'Title'
];
private static $extensions = [
Versioned::class,
];
private static $versioned_gridfield_extensions = true;
/**
* getCMSFields
* Projects - Amenities Form Fields
*
* @return void
*/
public function getCMSFields()
{
return new FieldList(
DropdownField::create('ProjectId', 'Link a Product', ProjectDetails::get()->map('ID', 'ProjectName')),
TextField::create('Title')
);
}
/**
* Search Fields
*/
private static $searchable_fields = [
'Title'
];
/**
* getCMSValidator - Required Fields
*
* @return void
*/
public function getCMSValidator()
{
return new RequiredFields([
'Title'
]);
}
ProjectDetails.php
private static $has_one = [
'ProjectPage' => ProjectPage::class,
'QuickFactsImage' => Image::class,
'ProjectTimeline' => ProjectTimeline::class
];
private static $many_many = [
'ProjectImage' => Image::class,
'FloorTypesImage' => Image::class
];
Ответ №1:
К сожалению, это не встроено в Silverstripe. Отношение has_many вернет HasManyList, подкласс DataList. Вам нужно будет указать метод получения в вашем объекте данных ProjectTimeline, чтобы выполнить цикл по этому списку и объединить имена проектов, такие как:
public function getProjectDetailsNames()
{
$names = $this->ProjectDetails()->column('ProjectName'); //returns just that column as an array
return implode(', ' $names);
}
Затем вы можете использовать этот метод в summary_fields:
private static $summary_fields = [
'getProjectDetailsNames' => 'Project Names',
'Title' => 'Title'
];
Я надеюсь, что это поможет вам решить эту проблему!
Комментарии:
1. Это становится похоже на [Чрезвычайная ситуация] Необнаруженное исключение BadMethodCallException: Объект->__вызов(): метод «столбец» не существует в «SilverStripeУрокиХвосты проектов» > Спасибо за ответ
2. В ProjectTitmeline функция $this->ProjectDetails() должна возвращать HasManyList, в котором есть этот метод. Трудно сказать, что здесь происходит без дополнительного кода или контекста.