Laravel по-русски

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

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

#1 Re: Laravel 5.x » Как увеличить функциональность объектов моделей БД » 15.03.2018 23:39:50

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

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

#2 Re: Laravel 5.x » Как увеличить функциональность объектов моделей БД » 15.03.2018 22:10:52

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

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

#3 Re: Laravel 5.x » Как увеличить функциональность объектов моделей БД » 15.03.2018 20:03:28

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

#4 Laravel 5.x » Как увеличить функциональность объектов моделей БД » 15.03.2018 19:53:52

raTaHoa
Ответов: 7

Версия 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", что бы описанный выше фрагмент шаблона работал, если такое вообще возможно?

п.с. обходные пути я знаю, но меня интересует именно такой вариант написания.

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