После небольшого разговора в комментариях я думаю, что это хорошее решение:
// YourModel.php
// Add this line of you want the "parents" property to be populated all the time.
protected $appends = ['parents'];
public function getParentsAttribute()
{
$collection = collect([]);
$parent = $this->parent;
while($parent) {
$collection->push($parent);
$parent = $parent->parent;
}
return $collection;
}
Затем вы можете найти своих родителей, используя:
YourModel::find(123)->parents
(экземпляр коллекции ) YourModel::find(123)->parents->implode('yourprop', '/')
(развернуто в строку, см. https://laravel.com/docs/5.4/collections#method-implode ) YourModel::find(123)->parents->reverse()->implode('yourprop', '/')
( обратный порядок https://laravel.com/docs/5.4/collections#method-reverse ) Как отметил Николай Киселев https://stackoverflow.com / a / 55103589/1346367 Вы также можете комбинировать это с этим, чтобы сохранить несколько запросов:
protected $with = ['parent.parent.parent'];
// or inline:
YourModel::find(123)->with(['parent.parent.parent']);
Это предварительно загружает родителя при загрузке объекта. Если вы решите не использовать это, родительский (загружается) загружается, как только вы позвоните $yourModel->parent
.
Вам необходимо создать экземпляр XmlReaderSettings и передать его своему XmlReader при его создании. Затем вы можете подписаться на ValidationEventHandler
в настройках, чтобы получать ошибки проверки. Ваш код будет выглядеть примерно так:
using System.Xml;
using System.Xml.Schema;
using System.IO;
public class ValidXSD
{
public static void Main()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);
// Parse the file.
while (reader.Read()) ;
}
// Display any warnings or errors.
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message);
else
Console.WriteLine("\tValidation error: " + args.Message);
}
}
У меня был такой вид автоматической проверки в VB, и вот как я это сделал (преобразовал в C #):
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = settings.ValidationFlags |
Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;
XmlReader XMLvalidator = XmlReader.Create(reader, settings);
Затем я подписался на событие settings.ValidationEventHandler
во время чтения файла.