0003: SHOW FULL TABLES WHERE Table_Type != 'VIEW'
0.0019s
0004: SHOW FULL FIELDS IN "Fluent_Domain"
0.0009s
0005: SHOW COLLATION LIKE 'utf8mb4_unicode_ci'
0.0002s
0006: SELECT DISTINCT "Fluent_Domain"."ClassName", "Fluent_Domain"."LastEdited", "Fluent_Domain"."Created", "Fluent_Domain"."Domain", "Fluent_Domain"."DefaultLocaleID", "Fluent_Domain"."ID",
CASE WHEN "Fluent_Domain"."ClassName" IS NOT NULL THEN "Fluent_Domain"."ClassName"
ELSE 'TractorCow\\Fluent\\Model\\Domain' END AS "RecordClassName"
FROM "Fluent_Domain"
0.0002s
0007: SHOW FULL FIELDS IN "Fluent_Locale"
0.0009s
0008: SELECT DISTINCT "Fluent_Locale"."ClassName", "Fluent_Locale"."LastEdited", "Fluent_Locale"."Created", "Fluent_Locale"."Title", "Fluent_Locale"."Locale", "Fluent_Locale"."URLSegment", "Fluent_Locale"."IsGlobalDefault", "Fluent_Locale"."UseDefaultCode", "Fluent_Locale"."Sort", "Fluent_Locale"."DomainID", "Fluent_Locale"."ID",
CASE WHEN "Fluent_Locale"."ClassName" IS NOT NULL THEN "Fluent_Locale"."ClassName"
ELSE 'TractorCow\\Fluent\\Model\\Locale' END AS "RecordClassName"
FROM "Fluent_Locale"
ORDER BY "Fluent_Locale"."Sort" ASC, "Fluent_Locale"."Locale" ASC
0.0002s
0009: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."URLSegment" = ?)
AND ("SiteTree_Live"."ParentID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0004s
0010: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ParentID" = ?)
AND ("SiteTree_Live"."URLSegment" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0003s
0011: SELECT DISTINCT "SiteConfig"."ClassName", "SiteConfig"."LastEdited", "SiteConfig"."Created", "SiteConfig"."GoogleAnalyticsAccountID", "SiteConfig"."GTMAccountID", "SiteConfig"."CookieIsActive", "SiteConfig"."ConsentNoticeDescription", "SiteConfig"."ConsentNoticeLearnMore", "SiteConfig"."ConsentModalTitle", "SiteConfig"."ConsentModalDescription", "SiteConfig"."ConsentModalPrivacyPolicyName", "SiteConfig"."ConsentModalPrivacyPolicyText", "SiteConfig"."AcceptAll", "SiteConfig"."AcceptSelected", "SiteConfig"."Decline", "SiteConfig"."OGSiteName", "SiteConfig"."TwitterHandle", "SiteConfig"."CreatorTwitterHandle", "SiteConfig"."FacebookAppID", "SiteConfig"."UseTitleAsMetaTitle", "SiteConfig"."SchemaOrganisationName", "SiteConfig"."Title", "SiteConfig"."Tagline", "SiteConfig"."CanViewType", "SiteConfig"."CanEditType", "SiteConfig"."CanCreateTopLevelType", "SiteConfig"."CookieLinkPrivacyID", "SiteConfig"."SchemaOrganisationImageID", "SiteConfig"."DefaultSocialImageID", "SiteConfig"."ID",
CASE WHEN "SiteConfig"."ClassName" IS NOT NULL THEN "SiteConfig"."ClassName"
ELSE 'SilverStripe\\SiteConfig\\SiteConfig' END AS "RecordClassName"
FROM "SiteConfig"
LIMIT 1
0.0003s
0012: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0002s
0013: SELECT DISTINCT "PublishDate" IS NULL AS "_SortColumn0", "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "BlogPost_Live"."PublishDate", "BlogPost_Live"."AuthorNames", "BlogPost_Live"."Summary", "BlogPost_Live"."ElementalAreaID", "BlogPost_Live"."FeaturedImageID", CASE WHEN "SiteTree_Live"."ClassName" IN ('SilverStripe\\CMS\\Model\\SiteTree', 'Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "SiteTree_Live"."Priority" WHEN "SiteTree_Live"."ClassName" IN ('Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "Page_Live"."Priority" ELSE NULL END AS "Priority", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live" LEFT JOIN "BlogPost_Live" ON "BlogPost_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID"
WHERE ("SiteTree_Live"."ID" = ?)
AND ("SiteTree_Live"."ClassName" IN (?, ?, ?))
AND ("PublishDate" < '2026-01-01 10:23:55')
ORDER BY "_SortColumn0" DESC, "BlogPost_Live"."PublishDate" DESC
LIMIT 1
0.0004s
0014: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "Page_Live"."MetaTitle", "Page_Live"."Canonical", "Page_Live"."Robots", "Page_Live"."ChangeFrequency", "Page_Live"."SitemapHide", "Page_Live"."HideSocial", "Page_Live"."OGtype", "Page_Live"."OGlocale", "Page_Live"."TwitterCard", "Page_Live"."SocialImageID", CASE WHEN "SiteTree_Live"."ClassName" IN ('SilverStripe\\CMS\\Model\\SiteTree', 'Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "SiteTree_Live"."Priority" WHEN "SiteTree_Live"."ClassName" IN ('Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "Page_Live"."Priority" ELSE NULL END AS "Priority", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName", "SiteTree_Live"."Sort"
FROM "SiteTree_Live" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID" INNER JOIN "BlogPost_Live" ON "SiteTree_Live"."ID" = "BlogPost_Live"."ID"
WHERE ("SiteTree_Live"."ID" = ?)
AND ("SiteTree_Live"."ClassName" IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0004s
0015: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "Blog_Live"."DefaultPostMetaTitle", "Blog_Live"."DefaultPostMetaDescription", "Blog_Live"."UseFeaturedAsSocialImage", "Blog_Live"."PostsPerPage", CASE WHEN "SiteTree_Live"."ClassName" IN ('SilverStripe\\Blog\\Model\\Blog', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder') THEN "Blog_Live"."ElementalAreaID" WHEN "SiteTree_Live"."ClassName" IN ('S2Hub\\Page\\CaseStudyHolder') THEN "CaseStudyHolder_Live"."ElementalAreaID" WHEN "SiteTree_Live"."ClassName" IN ('S2Hub\\Page\\SolutionHolder') THEN "SolutionHolder_Live"."ElementalAreaID" ELSE NULL END AS "ElementalAreaID", CASE WHEN "SiteTree_Live"."ClassName" IN ('SilverStripe\\CMS\\Model\\SiteTree', 'Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "SiteTree_Live"."Priority" WHEN "SiteTree_Live"."ClassName" IN ('Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "Page_Live"."Priority" ELSE NULL END AS "Priority", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName", "SiteTree_Live"."Sort"
FROM "SiteTree_Live" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "Blog_Live" ON "Blog_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "CaseStudyHolder_Live" ON "CaseStudyHolder_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "SolutionHolder_Live" ON "SolutionHolder_Live"."ID" = "SiteTree_Live"."ID"
WHERE ("SiteTree_Live"."ID" = ?)
AND ("SiteTree_Live"."ClassName" IN (?, ?, ?))
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0005s
0016: SELECT DISTINCT "SiteConfig"."ClassName", "SiteConfig"."LastEdited", "SiteConfig"."Created", "SiteConfig"."GoogleAnalyticsAccountID", "SiteConfig"."GTMAccountID", "SiteConfig"."CookieIsActive", "SiteConfig"."ConsentNoticeDescription", "SiteConfig"."ConsentNoticeLearnMore", "SiteConfig"."ConsentModalTitle", "SiteConfig"."ConsentModalDescription", "SiteConfig"."ConsentModalPrivacyPolicyName", "SiteConfig"."ConsentModalPrivacyPolicyText", "SiteConfig"."AcceptAll", "SiteConfig"."AcceptSelected", "SiteConfig"."Decline", "SiteConfig"."OGSiteName", "SiteConfig"."TwitterHandle", "SiteConfig"."CreatorTwitterHandle", "SiteConfig"."FacebookAppID", "SiteConfig"."UseTitleAsMetaTitle", "SiteConfig"."SchemaOrganisationName", "SiteConfig"."Title", "SiteConfig"."Tagline", "SiteConfig"."CanViewType", "SiteConfig"."CanEditType", "SiteConfig"."CanCreateTopLevelType", "SiteConfig"."CookieLinkPrivacyID", "SiteConfig"."SchemaOrganisationImageID", "SiteConfig"."DefaultSocialImageID", "SiteConfig"."ID",
CASE WHEN "SiteConfig"."ClassName" IS NOT NULL THEN "SiteConfig"."ClassName"
ELSE 'SilverStripe\\SiteConfig\\SiteConfig' END AS "RecordClassName"
FROM "SiteConfig"
LIMIT 1
0.0002s
0017: SELECT DISTINCT "File_Live"."ClassName", "File_Live"."LastEdited", "File_Live"."Created", "File_Live"."Version", "File_Live"."UserFormUpload", "File_Live"."CanViewType", "File_Live"."CanEditType", "File_Live"."Name", "File_Live"."Title", "File_Live"."ShowInSearch", "File_Live"."ParentID", "File_Live"."OwnerID", "File_Live"."FileHash", "File_Live"."FileFilename", "File_Live"."FileVariant", "File_Live"."ID",
CASE WHEN "File_Live"."ClassName" IS NOT NULL THEN "File_Live"."ClassName"
ELSE 'SilverStripe\\Assets\\File' END AS "RecordClassName"
FROM "File_Live"
WHERE ("File_Live"."ID" IS NULL)
AND ("File_Live"."ClassName" IN (?))
ORDER BY "File_Live"."Name" ASC
LIMIT 1
0.0002s
0018: SELECT DISTINCT "SeoHeadTag"."ClassName", "SeoHeadTag"."LastEdited", "SeoHeadTag"."Created", "SeoHeadTag"."Title", "SeoHeadTag"."Value", "SeoHeadTag"."Type", "SeoHeadTag"."PageID", "SeoHeadTag"."PageClass", "SeoHeadTag"."ID",
CASE WHEN "SeoHeadTag"."ClassName" IS NOT NULL THEN "SeoHeadTag"."ClassName"
ELSE 'CyberDuck\\SEO\\Model\\SeoHeadTag' END AS "RecordClassName"
FROM "SeoHeadTag" INNER JOIN "Page_HeadTags" ON "Page_HeadTags"."SeoHeadTagID" = "SeoHeadTag"."ID"
WHERE ("Page_HeadTags"."PageID" = ?)
AND ("SeoHeadTag"."Type" = ?)
ORDER BY "SeoHeadTag"."Title" ASC
0.0004s
0019: SELECT DISTINCT "SeoHeadTag"."ClassName", "SeoHeadTag"."LastEdited", "SeoHeadTag"."Created", "SeoHeadTag"."Title", "SeoHeadTag"."Value", "SeoHeadTag"."Type", "SeoHeadTag"."PageID", "SeoHeadTag"."PageClass", "SeoHeadTag"."ID",
CASE WHEN "SeoHeadTag"."ClassName" IS NOT NULL THEN "SeoHeadTag"."ClassName"
ELSE 'CyberDuck\\SEO\\Model\\SeoHeadTag' END AS "RecordClassName"
FROM "SeoHeadTag" INNER JOIN "Page_HeadTags" ON "Page_HeadTags"."SeoHeadTagID" = "SeoHeadTag"."ID"
WHERE ("Page_HeadTags"."PageID" = ?)
AND ("SeoHeadTag"."Type" = ?)
ORDER BY "SeoHeadTag"."Title" ASC
0.0002s
0020: SELECT DISTINCT "SeoHeadTag"."ClassName", "SeoHeadTag"."LastEdited", "SeoHeadTag"."Created", "SeoHeadTag"."Title", "SeoHeadTag"."Value", "SeoHeadTag"."Type", "SeoHeadTag"."PageID", "SeoHeadTag"."PageClass", "SeoHeadTag"."ID",
CASE WHEN "SeoHeadTag"."ClassName" IS NOT NULL THEN "SeoHeadTag"."ClassName"
ELSE 'CyberDuck\\SEO\\Model\\SeoHeadTag' END AS "RecordClassName"
FROM "SeoHeadTag" INNER JOIN "Page_HeadTags" ON "Page_HeadTags"."SeoHeadTagID" = "SeoHeadTag"."ID"
WHERE ("Page_HeadTags"."PageID" = ?)
AND ("SeoHeadTag"."Type" = ?)
ORDER BY "SeoHeadTag"."Title" ASC
0.0002s
0021: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ShowInMenus" = ?)
AND ("SiteTree_Live"."ParentID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
0.0004s
0022: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0023: SELECT DISTINCT "ElementalArea_Live"."ClassName", "ElementalArea_Live"."LastEdited", "ElementalArea_Live"."Created", "ElementalArea_Live"."Version", "ElementalArea_Live"."OwnerClassName", "ElementalArea_Live"."ID",
CASE WHEN "ElementalArea_Live"."ClassName" IS NOT NULL THEN "ElementalArea_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\ElementalArea' END AS "RecordClassName"
FROM "ElementalArea_Live"
WHERE ("ElementalArea_Live"."ID" = ?)
LIMIT 1
0.0002s
0024: SELECT DISTINCT "Element_Live"."ClassName", "Element_Live"."LastEdited", "Element_Live"."Created", "Element_Live"."AvailableGlobally", "Element_Live"."BubbleStyle", "Element_Live"."PreHeader", "Element_Live"."Version", "Element_Live"."Title", "Element_Live"."ShowTitle", "Element_Live"."Sort", "Element_Live"."ExtraClass", "Element_Live"."Style", "Element_Live"."ParentID", "Element_Live"."ID",
CASE WHEN "Element_Live"."ClassName" IS NOT NULL THEN "Element_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\BaseElement' END AS "RecordClassName"
FROM "Element_Live"
WHERE ("Element_Live"."ParentID" = ?)
ORDER BY "Element_Live"."Sort" ASC
0.0003s
0025: SELECT DISTINCT "ElementalArea_Live"."ClassName", "ElementalArea_Live"."LastEdited", "ElementalArea_Live"."Created", "ElementalArea_Live"."Version", "ElementalArea_Live"."OwnerClassName", "ElementalArea_Live"."ID",
CASE WHEN "ElementalArea_Live"."ClassName" IS NOT NULL THEN "ElementalArea_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\ElementalArea' END AS "RecordClassName"
FROM "ElementalArea_Live"
WHERE ("ElementalArea_Live"."ID" = ?)
LIMIT 1
0.0001s
0026: SELECT DISTINCT "PublishDate" IS NULL AS "_SortColumn0", "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", CASE WHEN "SiteTree_Live"."ClassName" IN ('SilverStripe\\CMS\\Model\\SiteTree', 'Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "SiteTree_Live"."Priority" WHEN "SiteTree_Live"."ClassName" IN ('Page', 'S2Hub\\Page\\Agencies', 'S2Hub\\Page\\BlockPage', 'SilverStripe\\ErrorPage\\ErrorPage', 'SilverStripe\\Blog\\Model\\Blog', 'SilverStripe\\Blog\\Model\\BlogPost', 'SilverStripe\\CMS\\Model\\RedirectorPage', 'SilverStripe\\CMS\\Model\\VirtualPage', 'SilverStripe\\UserForms\\Model\\UserDefinedForm', 'S2Hub\\Page\\CaseStudyHolder', 'S2Hub\\Page\\SolutionHolder', 'S2Hub\\Page\\CaseStudy', 'S2Hub\\Page\\Solution') THEN "Page_Live"."Priority" ELSE NULL END AS "Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "Page_Live"."MetaTitle", "Page_Live"."Canonical", "Page_Live"."Robots", "Page_Live"."ChangeFrequency", "Page_Live"."SitemapHide", "Page_Live"."HideSocial", "Page_Live"."OGtype", "Page_Live"."OGlocale", "Page_Live"."TwitterCard", "Page_Live"."SocialImageID", "BlogPost_Live"."PublishDate", "BlogPost_Live"."AuthorNames", "BlogPost_Live"."Summary", "BlogPost_Live"."ElementalAreaID", "BlogPost_Live"."FeaturedImageID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live" LEFT JOIN "Page_Live" ON "Page_Live"."ID" = "SiteTree_Live"."ID" LEFT JOIN "BlogPost_Live" ON "BlogPost_Live"."ID" = "SiteTree_Live"."ID"
WHERE ("BlogPost_Live"."ElementalAreaID" = ?)
AND ("SiteTree_Live"."ClassName" = ?)
AND ("SiteTree_Live"."ClassName" IN (?, ?, ?))
AND ("PublishDate" < '2026-01-01 10:23:55')
ORDER BY "_SortColumn0" DESC, "BlogPost_Live"."PublishDate" DESC
LIMIT 1
0.0013s
0027: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0028: SELECT DISTINCT "ElementalArea_Live"."ClassName", "ElementalArea_Live"."LastEdited", "ElementalArea_Live"."Created", "ElementalArea_Live"."Version", "ElementalArea_Live"."OwnerClassName", "ElementalArea_Live"."ID",
CASE WHEN "ElementalArea_Live"."ClassName" IS NOT NULL THEN "ElementalArea_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\ElementalArea' END AS "RecordClassName"
FROM "ElementalArea_Live"
WHERE ("ElementalArea_Live"."ID" = ?)
LIMIT 1
0.0001s
0029: SELECT DISTINCT "Element_Live"."ClassName", "Element_Live"."LastEdited", "Element_Live"."Created", "Element_Live"."AvailableGlobally", "Element_Live"."BubbleStyle", "Element_Live"."PreHeader", "Element_Live"."Version", "Element_Live"."Title", "Element_Live"."ShowTitle", "Element_Live"."Sort", "Element_Live"."ExtraClass", "Element_Live"."Style", "Element_Live"."ParentID", "Element_Live"."ID",
CASE WHEN "Element_Live"."ClassName" IS NOT NULL THEN "Element_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\BaseElement' END AS "RecordClassName"
FROM "Element_Live"
WHERE ("Element_Live"."ParentID" = ?)
ORDER BY "Element_Live"."Sort" ASC
LIMIT 1
0.0003s
0030: SELECT DISTINCT "ElementalArea_Live"."ClassName", "ElementalArea_Live"."LastEdited", "ElementalArea_Live"."Created", "ElementalArea_Live"."Version", "ElementalArea_Live"."OwnerClassName", "ElementalArea_Live"."ID",
CASE WHEN "ElementalArea_Live"."ClassName" IS NOT NULL THEN "ElementalArea_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\ElementalArea' END AS "RecordClassName"
FROM "ElementalArea_Live"
WHERE ("ElementalArea_Live"."ID" = ?)
LIMIT 1
0.0001s
0031: SELECT DISTINCT "Element_Live"."ClassName", "Element_Live"."LastEdited", "Element_Live"."Created", "ElementMarkdownRemote_Live"."URL", "ElementMarkdownRemote_Live"."MarkdownDataID", "Element_Live"."ID",
CASE WHEN "Element_Live"."ClassName" IS NOT NULL THEN "Element_Live"."ClassName"
ELSE 'DNADesign\\Elemental\\Models\\BaseElement' END AS "RecordClassName", "Element_Live"."Sort"
FROM "Element_Live" LEFT JOIN "ElementMarkdownRemote_Live" ON "ElementMarkdownRemote_Live"."ID" = "Element_Live"."ID"
WHERE ("Element_Live"."ID" = ?)
AND ("Element_Live"."ClassName" IN (?))
ORDER BY "Element_Live"."Sort" ASC
LIMIT 1
0.0002s
0032: SELECT DISTINCT "RemoteMarkdownData"."ClassName", "RemoteMarkdownData"."LastEdited", "RemoteMarkdownData"."Created", "RemoteMarkdownData"."Markdown", "RemoteMarkdownData"."Content", "RemoteMarkdownData"."ID",
CASE WHEN "RemoteMarkdownData"."ClassName" IS NOT NULL THEN "RemoteMarkdownData"."ClassName"
ELSE 'Netwerkstatt\\RemoteMarkdown\\Model\\RemoteMarkdownData' END AS "RecordClassName"
FROM "RemoteMarkdownData"
WHERE ("RemoteMarkdownData"."ID" = ?)
LIMIT 1
0.0002s
0033: SELECT DISTINCT "MenuSet"."ClassName", "MenuSet"."LastEdited", "MenuSet"."Created", "MenuSet"."Title", "MenuSet"."Slug", "MenuSet"."AllowChildren", "MenuSet"."ID",
CASE WHEN "MenuSet"."ClassName" IS NOT NULL THEN "MenuSet"."ClassName"
ELSE 'gorriecoe\\Menu\\Models\\MenuSet' END AS "RecordClassName"
FROM "MenuSet"
WHERE ("MenuSet"."Slug" = ?)
LIMIT 1
0.0002s
0034: SELECT DISTINCT "Link"."ClassName", "Link"."LastEdited", "Link"."Created", "Link"."Anchor", "Link"."Title", "Link"."Type", "Link"."URL", "Link"."Email", "Link"."Phone", "Link"."OpenInNewWindow", "Link"."SelectedStyle", "Link"."SiteTreeID", "Link"."FileID", "MenuLink"."Sort", "MenuLink"."MenuSetID", "MenuLink"."ParentID", "Link"."ID",
CASE WHEN "Link"."ClassName" IS NOT NULL THEN "Link"."ClassName"
ELSE 'gorriecoe\\Link\\Models\\Link' END AS "RecordClassName"
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."MenuSetID" = ?)
AND ("Link"."ClassName" IN (?))
ORDER BY "MenuLink"."Sort" ASC
0.0004s
0035: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0036: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0002s
0037: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0038: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0001s
0039: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0040: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0001s
0041: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0042: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0001s
0043: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0044: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0001s
0045: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0046: SELECT EXISTS(SELECT *
FROM "Link" LEFT JOIN "MenuLink" ON "MenuLink"."ID" = "Link"."ID"
WHERE ("MenuLink"."ParentID" = ?)
AND ("Link"."ClassName" IN (?)))
0.0001s
0047: SELECT "Version" FROM "SiteTree" WHERE "ID" = ?
0.0001s
0048: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0049: SELECT DISTINCT "SiteTree"."ClassName", "SiteTree"."LastEdited", "SiteTree"."Created", "SiteTree"."Priority", "SiteTree"."CanViewType", "SiteTree"."CanEditType", "SiteTree"."Version", "SiteTree"."URLSegment", "SiteTree"."Title", "SiteTree"."MenuTitle", "SiteTree"."Content", "SiteTree"."MetaDescription", "SiteTree"."ExtraMeta", "SiteTree"."ShowInMenus", "SiteTree"."ShowInSearch", "SiteTree"."Sort", "SiteTree"."HasBrokenFile", "SiteTree"."HasBrokenLink", "SiteTree"."ReportClass", "SiteTree"."ParentID", "SiteTree"."ID",
CASE WHEN "SiteTree"."ClassName" IS NOT NULL THEN "SiteTree"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree"
WHERE ("SiteTree"."ID" = ?)
ORDER BY "SiteTree"."Sort" ASC
LIMIT 1
0.0002s
0050: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
0051: SELECT DISTINCT "SiteTree_Live"."ClassName", "SiteTree_Live"."LastEdited", "SiteTree_Live"."Created", "SiteTree_Live"."Priority", "SiteTree_Live"."CanViewType", "SiteTree_Live"."CanEditType", "SiteTree_Live"."Version", "SiteTree_Live"."URLSegment", "SiteTree_Live"."Title", "SiteTree_Live"."MenuTitle", "SiteTree_Live"."Content", "SiteTree_Live"."MetaDescription", "SiteTree_Live"."ExtraMeta", "SiteTree_Live"."ShowInMenus", "SiteTree_Live"."ShowInSearch", "SiteTree_Live"."Sort", "SiteTree_Live"."HasBrokenFile", "SiteTree_Live"."HasBrokenLink", "SiteTree_Live"."ReportClass", "SiteTree_Live"."ParentID", "SiteTree_Live"."ID",
CASE WHEN "SiteTree_Live"."ClassName" IS NOT NULL THEN "SiteTree_Live"."ClassName"
ELSE 'SilverStripe\\CMS\\Model\\SiteTree' END AS "RecordClassName"
FROM "SiteTree_Live"
WHERE ("SiteTree_Live"."ID" = ?)
ORDER BY "SiteTree_Live"."Sort" ASC
LIMIT 1
0.0001s
Using Envoyer with Silverstripe CMS
Using Envoyer with Silverstripe CMS
Depending on the project, deployment can be a very complex problem. But in 80% of Silverstripe CMS projects, the steps are always the same:
Pull the current source code
Install the composer dependencies
Build the database (dev/build)
Build the frontend
Even if the deployment is simple, deployment automation makes sense. It accelerates the process and reduces sources of errors. Often, deployments are nearly the same but there are small differences. You will get back the time you need to setup the deployment after few repetitions. A big advantage in our company is that any member of the team can deploy: They just merge into the deployment branch and it will deploy on the server. In bigger projects we have multiple deployed branches - the main branch will deploy on the live URL and a staging branch will deploy on a preview URL.
There are various possibilities for deployment automation. Envoyer is originally a Laravel product, but it can be used to deploy any PHP project. In our company, we are using it because it is easy to use and reasonably priced, especially if you have many projects.
One limitiation is limited team management. You can share projects with other Envoyer users, but only single projects. That makes it difficult to share all projects with a new team member.
Requirements
Envoyer is perfect, if you are already using git-based deployments with composer. To use it, you need the possibility to login via SSH with key authentication. The deployments are run on the server, so you need git, php and composer on the server.
We learned, that you also need a writable home folder. Envoyer just writes a lock file, but the path is not configurable. On one of our hosting providers, it is not possible to write in the home folder and there is no way to bypass this requirement - so Envoyer is not usable here.
You also need one of these GIT-Providers.
GitHub
Bitbucket
GitLab
Self-Hosted GitLab
Other options are not possible at the moment. As private repositories on GitHub are now free, we moved our repositories to GitHub to use Envoyer.
Server preparation
Folder structure
Envoyer uses the following directory structure in the deployment folder, similar to Deployer:
/releases: One folder per release
/current: Link on the active release
/assets: Shared between deployments
The Silverstripe CMS .env file we put into the releases folder. Envoyer also provides an online management of the environment file, but we don't use it.
New project
Create project
To add a new project, you first have to provide the repository informations and the branch you want to deploy. Select "Other" as the project type, otherwise Envoyer will try to use artisan commands.
We only tested GitHub. With Github you need administrative permissions, editing permissions are not enough for Envoyer to put up the hook to enable automatic deployments. To enable Git-providers, you have to setup them in the general settings.
If your organization has third-party restrictions enabled, the organization's owner will need to approve the integration. This can be done using the following link:
After creating the project, you have to make some project settings.
In "The Basics", you can set a "Health Check URL". This is an URL Envoyer will check after the deployment.
The "Deployments to Retain" are the number of deployments Envoyer will keep so that you can return to this state fast. Beware that they will occupy disk space on the server. And of course there are no backwards migrations in Silverstripe so a rollback is never complete.
In "Source Control", you have to check the checkbox "Deploy When Code is Pushed". With this option, the deployment is run when the given branch is updated, which is what we want.
Project overview
Now you have the project overview with these tabs:
Deployments (empty right now)
Servers (see below)
Deployment hooks (see below)
Heartbeats: Monitoring for cron jobs (we don't use this feature)
Notifications: Add notifications via Slack, Teams, Discord or Email
Collaborateurs: Add permissions to other people
Server settings
Now you can configure your server(s). Most important are the (ssh) user and project path. On our servers, "Reload FPM" will not work the way Envoyer tries to do it, so we configure a hook for it.
Also, we have different PHP versions on the server, so the PHP path is not just php, but php7.4 or php8.0. To start composer with a different php version, you have to set the full path, in our case php7.4 /usr/local/bin/composer.
After setting the server settings, you need to allow Envoyer to connect to the server. Click on the Key-Icon on the right, copy the key and paste it into the file ~/.ssh/authorized_keys in the user folder of the user, you are using for the deployment.
Linked folders
On the tab "Deployment hooks" you can add everything that should happen after besides the standard Envoyer actions.
Before configuring the hooks, we define "linked folders". These are folders which are shared between deployments. The most important one is assets, but we also often link node_modules (to speed up the frontend build). To keep silverstripe-cache is not a good idea, we tried that. The folder you are linking has to already exist in the project folder.
Deployment hooks
The standard Envoyer actions are:
Clone new release
Install composer dependencies
Activate New Release
Purge Old Releases
You can configure hooks and move them around where they should be executed. In our projects, we build the frontend
code on the server and use these steps:
Clone new release
Install composer dependencies
Build Frontend
/dev/build
Activate New releases
Purge Old Releases
Reload apache
The configuration of a hook is straightforward: Just write a script - everything is possible. You have to select your server(s) on the bottom of the form.
This is our standard dev/build-Hook: We set the PHP-Version, switch to the release directory and run dev/build. You have to select your server definition on the bottom, this allows for different hooks on multi-server deployments.
You can reuse hooks in other projects by copying the hooks.
Conclusion
Now you just have to click "Deploy", future commits will trigger deployments automatically. This guide just covers the basics, very interesting are the integrations for notifications.