Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Подскажите, в чем прикол?
Есть таблицы
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
Нет, ошибся PHP 5.4.26 (cli) (built: Mar 12 2014 12:41:31) , но сути дела это не меняет
Не в сети
Cheshirrski, спасибо за ответ!
Не, с правами все норм, ошибка то появляется, то исчезает.
В общем сам нашел ответ - APC, вырубил его и все норм!
Теперь думаю на что APC поменять или как его ковырять что заработало ))
- В общем сам нашел ответ — APC, вырубил его и все норм!
У меня была та же ерунда с XCache — он то и дело (причём внезапно) отказывался находить классы, объявленные в том же файле, но после их использования. Без XCache этой ошибки ни разу не возникало. Пока выяснил, в чём проблема, много хорошего думал о PHP.
Не в сети
Возможно xCache и APC не хватает памяти, сам лично не сталкивался, но 16М для Xcache и 32М для APC ( значения по умолчанию ) мало. Воспроизвести эти ошибки мне не удалось( если не хватало памяти кэшеры просто не работали), но, теоретически, это возможно. Тесты проводил на VPS и на домашнем сервере с ubuntu server 12.04. Попробуйте установить xcache.size=32M для xCache и apc.shm_size=64M для APC и отпишитесь о результатах пожалуйста.
Не в сети
- Попробуйте установить 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
Не в сети
Судя по конструкции
@if($brandsize->brand())
@endif
Вы делаете что-то вроде костыля для подгрузки брендов чтобы потом использовать $brandsize->brand?. Не проще ли тогда использовать with? Попробуйте заменить ваш костыль на
Brandsize::with('brand')
при формировании переменной $brandsize. Я более чем уверен, что это решит вашу проблему.
Изменено Agel_Nash (27.04.2014 20:06:24)
Время, качество, цена - выбирай любые 2
Не в сети
Судя по конструкции
@if($brandsize->brand()) @endif
Вы делаете что-то вроде костыля для подгрузки брендов чтобы потом использовать $brandsize->brand?. Не проще ли тогда использовать with? Попробуйте заменить ваш костыль на
Brandsize::with('brand')
при формировании переменной $brandsize. Я более чем уверен, что это решит вашу проблему.
Не не, там ошибка, писал по памяти, должно быть так
@if($brandsize->brand->count)
@endif
@if($brandsize->brand->count())
@endif
}%> Попробуйте установить 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
%%
Поставил - полет нормальный
Судя по конструкции
@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
Не вижу принципиальной разницы между $brandsize->brand() и $brandsize->brand
Ну вообще $brandsize->brand, по логике php это переменная. А $brandsize->brand() - функция. Не могу утверждать как ведет себя в данном случае laravel, но предполагаю, что при обращении к brand как к переменной, происходит перегрузка при помощи магической функции __get. В то время, как при использовании различных php акселераторов, в некоторых случаях эта перегрузка не срабатывает. И использование with может позволить решить эту проблему.
Вот примерно такая у меня логика, но могу ошибаться, т.к. код не узчал. Поэтому поправьте меня если я не прав.
Время, качество, цена - выбирай любые 2
Не в сети
Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен
Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен
Я о том, что подгрузка данных в brand при обращении без Eager Loading и с ней происходит по разному. В одном случае всегда принудительно получаются данные, т.к. функция вызывается в явном виде. А в другом случае данные загружаются только в момент обращения к ним. И если данные еще не получены, то срабатывает вызов функции __get() в которой происходит прямой перебор всех доступных ключей. И я предположил, что именно из-за этого перебора возникает проблема с акселератором.
Перечитайте мое предыдущее сообщение еще раз и посмотрите класс \Illuminate\Database\Eloquent\Model - может поймете что я имел в виду.
Время, качество, цена - выбирай любые 2
Не в сети
Agel_Nash имеет в виду, что «Для laravel вызов $brandsize->brand и $brandsize->brand() разнозначен» только в том случае, если до этого была выполнена активная загрузка (eager loading) поля brand. Правда, обычно с этим проблем не возникает — если забыл подгрузить через with('brand') — PHP выбросит ошибку при попытке прочитать null как объект, так как без with() простое обращение $brandsize->brand как к свойству равнозначно чтению атрибута (поля) таблицы, а такого атрибута нет — поэтому возвращается null. В итоге $brandsize->brand->id будет работать по-разному в зависимости от того, был ли вызван with() ранее или нет.
Но как я уже сказал эта проблема обычно ловится сразу, во всяком случае при строгом уровне ошибок PHP.
Не в сети
Страницы 1