Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.03.2018 19:53:52

Как увеличить функциональность объектов моделей БД

Версия 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)

Не в сети

#2 15.03.2018 19:58:45

Re: Как увеличить функциональность объектов моделей БД

Не в сети

#3 15.03.2018 20:03:28

Re: Как увеличить функциональность объектов моделей БД

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

Не в сети

#4 15.03.2018 21:51:40

Re: Как увеличить функциональность объектов моделей БД

такой метод нужно писать в модели Galereya.

У тебя же есть такая модель? или ты просто накатил таблицу, не создав модель?


Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs

Не в сети

#5 15.03.2018 22:10:52

Re: Как увеличить функциональность объектов моделей БД

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 ) }}

но на мой взгляд это выглядит, как небольшой костыль, так как это попытка внедрить процедурное программирование как надстройку над ООП.

Не в сети

#6 15.03.2018 23:28:37

Re: Как увеличить функциональность объектов моделей БД

немного покопавшись, я понял, что модель данных и экземпляр данных имеют общее только связку, но не класс.

Не понял. Что такое модель данных, а что экземпляр?

Ты получил ошибку, потому-что не стал использовать 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)

Не в сети

#7 15.03.2018 23:28:42

Re: Как увеличить функциональность объектов моделей БД

Ты получаешь ошибку 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

Не в сети

#8 15.03.2018 23:39:50

Re: Как увеличить функциональность объектов моделей БД

Всем спасибо за ответ.

Я думал, что при использовании DB::table, он сам возьмет модель по названию таблицы.
Действительно следовало попробовать сразу из класса модели вызвать.

Не в сети

Подвал раздела