Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Версия Laravel: 5.6
Версия PHP: 7.1
есть например таблица структуры:
Schema::create('galereya', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('images');
});
в контроллере например получаю данные так:
$galerees = DB::table('galereya')->get();
return view('galereya',['galerees' => $galerees]);
в поле "images" хранятся ссылки на картинки примерно в таком виде: "/img/1.png;/img/2.png;/img/3.png"
и при выводе надо это дело разбить на массив.
п.с. это не главная цель вопроса, я знаю различные способы как это можно сделать.
хочу в шаблоне сделать например вот так:
@foreach($galerees as $galereya)
{{ $galereya->id }}<br>
{{ $galereya->name }}<br>
@foreach($galereya->splitImages() as $image)
<img src="{{ $image }}">
@endforeach
<hr>
@endforeach
собственно вопрос в том, где (или как) мне необходимо написать метод "splitImages", что бы описанный выше фрагмент шаблона работал, если такое вообще возможно?
п.с. обходные пути я знаю, но меня интересует именно такой вариант написания.
Изменено raTaHoa (15.03.2018 19:57:42)
Не в сети
Не в сети
covobo, описание по указанной ссылке не отвечает на мой вопрос.
как я указал, меня интересует не само разбитие на массив, а создания функции, которая бы внутри могла бы сделать мелкие манипуляции с данными, того же объекта
Не в сети
такой метод нужно писать в модели Galereya.
У тебя же есть такая модель? или ты просто накатил таблицу, не создав модель?
Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs
Не в сети
code_bright_anywhere, этот метод становиться методом модели, а не экземпляра данных.
Именно из-за того, что мои ожидания не подтвердились, я и задал вопрос.
сейчас я изучаю Laravel, что бы знать как и что работает, и что когда делать. По этому придумываю себе задачи различной сложности.
вот что я писал:
вот модель:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Bestiary extends Model
{
protected $table = 'bestiary';
public $timestamps = false;
public function firstImg(){
$imgs = explode(';',$this->images);
return $imgs[0];
}
public function getUrls(){
$temp = explode(';',$this->urls_info);
$urls = [];
foreach($temp as $str){
$tmp = explode('>',$str);
$urls[$tmp[0]] = $tmp[1];
}
return $urls;
}
}
метод в контроллере:
public function animals(){
$bestiary = DB::table('bestiary')->whereNull('inherited_id')->get();
return view('lk/bestiary',['animals' => $bestiary, 'baseUrl' => 'bestiary']);
}
и фрагмент из шаблона:
@section('tables')
@include('layouts.lkback')
<div id=flat>
@foreach($animals as $animal)
<a href="/lk/{{ $baseUrl }}/{{ $animal->id }}" id=a{{ $animal->id }}><div class=animal>
<span class=i-sym><div data-num="{{ $animal->id }}" class="i-del"></div></span>
<span class=i-sym><div data-num="{{ $animal->id }}" class="i-edit"></div></span>
@if($animal->images)
<img src='/{{ $animal->firstImg() }}'>
@endif
<h6>{{ $animal->name }}</h6>
@foreach($animal->getUrls() as $name => $url)
<a href="{{ $url }}">{{ $name }}</a>
@endforeach
</div></a>
@endforeach
</div>
@endsection
на что получил вот такую ошибку:
"Call to undefined method stdClass::getUrls()"
немного покопавшись, я понял, что модель данных и экземпляр данных имеют общее только связку, но не класс.
я конечно могу делать вот так:
{{ Bestiary::getUrls( $animal ) }}
но на мой взгляд это выглядит, как небольшой костыль, так как это попытка внедрить процедурное программирование как надстройку над ООП.
Не в сети
немного покопавшись, я понял, что модель данных и экземпляр данных имеют общее только связку, но не класс.
Не понял. Что такое модель данных, а что экземпляр?
Ты получил ошибку, потому-что не стал использовать ORM (тобишь Eloquent), а сделал вывборку через \DB и получил массив stdClass[].
Используй ORM, тогда метод getUrls будет работать.
public function animals(){
$bestiary = \App\Bestiary::query()->whereNull('inherited_id')->get();
return view('lk/bestiary',['animals' => $bestiary, 'baseUrl' => 'bestiary']);
}
или сразу
public function animals(){
$bestiary = \App\Bestiary::whereNull('inherited_id')->get();
return view('lk/bestiary',['animals' => $bestiary, 'baseUrl' => 'bestiary']);
}
Изменено covobo (15.03.2018 23:29:29)
Не в сети
Ты получаешь ошибку call to undefined method stdClass - ключевое для тебя здесь то, что ты работаешь с stdClass. Твоя же задача получать инстанс класса Model который наследуют все твои модели приложения. получить его можно очень просто, используя Eloquent для построения запросов.
// это даст тебе коллекцию из объектов Bestiary (кстати, а что такое Bestiary?)
$bestiary = Bestiary::whereNull('inherited_id')->get();
// соответсвенно в цикле ты будешь работать с моделью
@foreach ($animals as $animal)
$animal->getUrls(); // будет доступен
@enforeach
и старайся как можно реже прибегать к чистым activeRecord, используй Eloquent
"немного покопавшись, я понял, что модель данных и экземпляр данных имеют общее только связку, но не класс." - это как?
Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs
Не в сети
Всем спасибо за ответ.
Я думал, что при использовании DB::table, он сам возьмет модель по названию таблицы.
Действительно следовало попробовать сразу из класса модели вызвать.
Не в сети
Страницы 1