Laravel по-русски

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

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

#1 24.04.2014 10:57:03

Андрей

Undefined property $attributes

Подскажите, в чем прикол?
Есть таблицы

Brands - марка кабеля

Schema::create('brands', function(Blueprint $table) {
			$table->increments('id');
			$table->string('name')->unique();
			$table->text('description');
			$table->integer('category_id')->unsigned();
			$table->string('letter', 1);
			$table->timestamps();
		});

Brandsizes - маркоразмер кабеля

Schema::create('brandsizes', function(Blueprint $table) {
			$table->increments('id');
			$table->string('name')->unique();
			$table->text('description');
			$table->integer('brand_id')->unsigned();
			$table->timestamps();
		});

Модель Brand

class Brand extends \Eloquent {

	// Add your validation rules here
	public static $rules = [
		// 'title' => 'required'
	];

	// Don't forget to fill this array
    protected $guarded = array('id');
	protected $fillable = [];


    public function brandsizes(){
        return $this->hasMany('Brandsize','brand_id');
    }

    public function category(){
        return $this->belongsTo('Category','category_id');
    }

}

Модель Brandsizes

class Brandsize extends \Eloquent {

	// Add your validation rules here
	public static $rules = [
		// 'title' => 'required'
	];

	// Don't forget to fill this array
    protected $guarded = array('id');
	protected $fillable = [];

    public function brand(){
        return $this->belongsTo('Brand');
    }

    public function properties(){
        return $this->hasMany('Bproperty','brandsize_id');
    }

}

Есть есть вьюха страницы маркоразмера show.blade.php

@extends('layouts.master')

@section('content')
    @if($brandsize->brand())
    @endif
<div class="col-md-12">
    <h1>{{link_to_route('brands.show',$brandsize->brand->name,array('id'=>$brandsize->brand->id))}} > {{$brandsize->name}}</h1>
    <ul class="nav nav-tabs">
    </ul>
    <div class="tab-content" id="brand_body">
        @foreach($brandsize->properties as $property)
            {{$property->property->name}}: {{$property->value}}<br/>
        @endforeach

    </div>
</div>
@stop

Все нормально работает, все показывается, но через какой-то промежуток времени вылезает ошибка

Undefined property: Brand::$attributes (View: /var/www/cable/data/www/cable/app/views/brandsizes/show.blade.php)

Удаляю во вьхе все где используется $brandsize->brand, обновляю страницу, возвращаю $brandsize->brand и все опять начинает работать нормально, но через какое-то время опять отваливается (((.

В чем прикол? Искал по форумам, все сводится в тому что надо до php 5.5 обновиться, сейчас стоит php 5.4.7

#2 24.04.2014 11:34:30

Андрей

Re: Undefined property $attributes

Нет, ошибся PHP 5.4.26 (cli) (built: Mar 12 2014 12:41:31) , но сути дела это не меняет

#3 24.04.2014 12:05:14

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Undefined property $attributes

Возможно что-то не то с правами на папку /app/storage/views, сам сижу пока на php 5.3, все нормально работает

Не в сети

#4 25.04.2014 20:30:48

Андрей

Re: Undefined property $attributes

Cheshirrski, спасибо за ответ!
Не, с правами все норм, ошибка то появляется, то исчезает.

В общем сам нашел ответ - APC, вырубил его и все норм!
Теперь думаю на что APC поменять или как его ковырять что заработало ))

#5 26.04.2014 17:09:30

Re: Undefined property $attributes

  1. В общем сам нашел ответ — APC, вырубил его и все норм!

У меня была та же ерунда с XCache — он то и дело (причём внезапно) отказывался находить классы, объявленные в том же файле, но после их использования. Без XCache этой ошибки ни разу не возникало. Пока выяснил, в чём проблема, много хорошего думал о PHP.

Не в сети

#6 27.04.2014 14:01:50

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Undefined property $attributes

Возможно xCache и APC не хватает памяти, сам лично не сталкивался, но 16М для Xcache и 32М для APC ( значения по умолчанию ) мало. Воспроизвести эти ошибки мне не удалось( если не хватало памяти кэшеры просто не работали), но, теоретически, это возможно. Тесты проводил на VPS и на домашнем сервере с ubuntu server 12.04. Попробуйте установить xcache.size=32M для xCache и apc.shm_size=64M для APC и отпишитесь о результатах пожалуйста.

Не в сети

#7 27.04.2014 14:05:02

Re: Undefined property $attributes

  1. Попробуйте установить xcache.size=32M для xCache и apc.shm_size=64M для APC и отпишитесь о результатах пожалуйста.

XCache у меня имел по-моему около 48М для опкодов и всё равно падал. От него отказался несколько лет назад, APC у меня используется до сих пор, проблем не замечал. Настройки:

apc.cache_by_default => On => On
apc.gc_ttl => 3600 => 3600
apc.max_file_size => 1M => 1M
apc.num_files_hint => 1000 => 1000
apc.shm_size => 128M => 128M
apc.write_lock => On => On

Не в сети

#8 27.04.2014 20:04:30

Re: Undefined property $attributes

Судя по конструкции

@if($brandsize->brand())
@endif

Вы делаете что-то вроде костыля для подгрузки брендов чтобы потом использовать $brandsize->brand?. Не проще ли тогда использовать with? Попробуйте заменить ваш костыль на

Brandsize::with('brand')

при формировании переменной $brandsize. Я более чем уверен, что это решит вашу проблему.

Изменено Agel_Nash (27.04.2014 20:06:24)


Время, качество, цена - выбирай любые 2

Не в сети

#9 28.04.2014 12:14:22

Андрей

Re: Undefined property $attributes

Agel_Nash пишет:

Судя по конструкции

@if($brandsize->brand())
@endif

Вы делаете что-то вроде костыля для подгрузки брендов чтобы потом использовать $brandsize->brand?. Не проще ли тогда использовать with? Попробуйте заменить ваш костыль на

Brandsize::with('brand')

при формировании переменной $brandsize. Я более чем уверен, что это решит вашу проблему.


Не не, там ошибка, писал по памяти, должно быть так

@if($brandsize->brand->count)
@endif

#10 28.04.2014 12:16:07

Андрей

Re: Undefined property $attributes

@if($brandsize->brand->count())
@endif

#11 28.04.2014 14:41:34

Андрей

Re: Undefined property $attributes

Proger_XP пишет:

}%> Попробуйте установить xcache.size=32M для xCache и apc.shm_size=64M для APC и отпишитесь о результатах пожалуйста.
XCache у меня имел по-моему около 48М для опкодов и всё равно падал. От него отказался несколько лет назад, APC у меня используется до сих пор, проблем не замечал. Настройки:
%%
apc.cache_by_default => On => On
apc.gc_ttl => 3600 => 3600
apc.max_file_size => 1M => 1M
apc.num_files_hint => 1000 => 1000
apc.shm_size => 128M => 128M
apc.write_lock => On => On
%%

Поставил - полет нормальный

#12 28.04.2014 14:46:04

Андрей

Re: Undefined property $attributes

Agel_Nash пишет:

Судя по конструкции

@if($brandsize->brand())
@endif

Вы делаете что-то вроде костыля для подгрузки брендов чтобы потом использовать $brandsize->brand?. Не проще ли тогда использовать with? Попробуйте заменить ваш костыль на

Brandsize::with('brand')

при формировании переменной $brandsize. Я более чем уверен, что это решит вашу проблему.


Это не костыль http://laravel.com/docs/eloquent#relationships

public function brand(){
        return $this->belongsTo('Brand');
}

Не вижу принципиальной разницы между $brandsize->brand() и $brandsize->brand

#13 28.04.2014 17:38:22

Re: Undefined property $attributes

Андрей пишет:

Не вижу принципиальной разницы между $brandsize->brand() и $brandsize->brand

Ну вообще $brandsize->brand, по логике php это переменная. А $brandsize->brand() - функция. Не могу утверждать как ведет себя в данном случае laravel, но предполагаю, что при обращении к brand как к переменной, происходит перегрузка при помощи магической функции __get. В то время, как при использовании различных php акселераторов, в некоторых случаях эта перегрузка не срабатывает. И использование with может позволить решить эту проблему.

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


Время, качество, цена - выбирай любые 2

Не в сети

#14 29.04.2014 12:04:11

Андрей

Re: Undefined property $attributes

Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен

#15 29.04.2014 17:12:41

Re: Undefined property $attributes

Андрей пишет:

Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен

Я о том, что подгрузка данных в brand при обращении без Eager Loading и с ней происходит по разному. В одном случае всегда принудительно получаются данные, т.к. функция вызывается в явном виде. А в другом случае данные загружаются только в момент обращения к ним. И если данные еще не получены, то срабатывает вызов функции __get() в которой происходит прямой перебор всех доступных ключей. И я предположил, что именно из-за этого перебора возникает проблема с акселератором.

Перечитайте мое предыдущее сообщение еще раз и посмотрите класс \Illuminate\Database\Eloquent\Model - может поймете что я имел в виду.


Время, качество, цена - выбирай любые 2

Не в сети

#16 29.04.2014 19:04:08

Re: Undefined property $attributes

Agel_Nash имеет в виду, что «Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен» только в том случае, если до этого была выполнена активная загрузка (eager loading) поля brand. Правда, обычно с этим проблем не возникает — если забыл подгрузить через with('brand') — PHP выбросит ошибку при попытке прочитать null как объект, так как без with() простое обращение $brandsize->brand как к свойству равнозначно чтению атрибута (поля) таблицы, а такого атрибута нет — поэтому возвращается null. В итоге $brandsize->brand->id будет работать по-разному в зависимости от того, был ли вызван with() ранее или нет.

Но как я уже сказал эта проблема обычно ловится сразу, во всяком случае при строгом уровне ошибок PHP.

Не в сети

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