2016-09-27 2 views
0

я следующие таблицы, созданные с помощью Schema S:Работа с красноречивым отношений в Laravel 5.3

Schema::create('typen', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name')->unique(); 
    }); 

Schema::create('auktionen', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('typ')->unsigned(); 

    $table->foreign('typ')->references('id')->on('typen'); 
    }); 

таблице typen создается только один раз содержит фиксированные значения:

Typen 
id| name 
1 | Typ 1 
2 | Typ 2 
... 

Эти значения являются постоянными , в течение срока действия приложения больше не будет добавлено. So every Auktion I create должно быть связано с Typ. Я создал модель для Auktion и думал об этом как отношения «один-к-одному» (это правильно?).

Я хотел бы создать Auktion с заданной Typ с помощью красноречивых запросов, как это:

$thetyp = App\Typ::where("id", "=", 1)->first(); 
    $auktion->typ()->associate($thetyp); 

и принести name из Typ моих Auktion:

$auktion->typ->name; 

В настоящее время моя модель выглядит например, для Auktion:

public function typ() 
    { 
    return $this->hasOne('App\Typ', 'typ'); 
    } 

который не работает. Я уже пробовал устанавливать разные отношения, но я просто заканчиваю разные коды ошибок, начиная от неопределенных методов (associate() до ошибки, когда заявление SQL не пыталось обновить таблицу typen (при использовании save() - чего я действительно не хочу).

Может ли кто-нибудь прояснить эту проблему для меня и объяснить, какие отношения я должен использовать?

EDIT1: Как уже говорилось в комментарии я уже пробовал использовать belongsTo в Auktion модели

public function typ() 
    { 
    return $this->belongsTo('App\Typ', 'typ'); 
    } 

, что приводит к Undefined property: App\Auktion::$typ при вызове

$thetyp = App\Typ::where("id", "=", 1)->first(); 
$auktion->typ()->save($thetyp); 

и при вызове $auktion->typ->name; в

Trying to get property of non-object 

EDIT2:

Я просто понял, что

echo $auktion->typ()->first()->name; 

действительно работает. But referring to this answer это должно быть таким же, как

echo $auktion->typ->name; 

Что именно я делаю не так?

EDIT3:

Я попытался с помощью предложенного кода:

$thetyp = App\Typ::find($typ); 
    $auktion->typ->save($thetyp); 

После того как я переходите к виду ehere я запускаю код, который я получил это:

enter image description here

I получил это второй раз сегодня, так же из ниоткуда

+1

См. Мой ответ. Надеюсь, поможет! – idelara

ответ

1

Вот некоторые улучшения кода:

$thetyp = App\Typ::where("id", "=", 1)->first(); 
$auktion->typ()->save($thetyp); 

Кому:

//Will return null if Model is not found 
$thetyp = App\Typ::find(1); 
//You actually have to retrieve the relationship, because calling typ() 
//will only retrieve the Relationship query 
$auktion->typ()->get()->save($thetyp); 

Проблема заключается в том, что отношения определяется в обратном направлении. Вам необходимо сделать Аукцион belongTo и поменять тип hasMany Аукционы. Заявление будет читать:

«Тип имеет много аукционов. Аукцион имеет один тип».

Вот классы (на английском языке, извините, мой немецкий плохо :(так что я просто сделал это на английском языке) с миграциями:

-Auction класс:

class Auction extends Model 
{ 
    protected $table = 'auction'; 

    public function type() 
    { 
     return $this->belongsTo('App\Type'); 
    } 
} 

-Auction миграция :

Schema::create('auction', function(Blueprint $table){ 

$table->increments('id'); 
$table->integer('type_id')->references('id')->on('type')->nullable(); 
$table->string('title')->nullable(); 
$table->string('description')->nullable(); 

$table->timestamps(); 

}); 

-Тип класс:

class Type extends Model 
{ 
    protected $table = 'type'; 

    public function auction() 
    { 
     return $this->hasMany('App\Auction'); 
    } 
} 

-Тип миграция:

Schema::create('type', function(Blueprint $table){ 

     $table->increments('id'); 
     $table->string('name'); 

     $table->timestamps(); 
}); 

Во-первых, вы можете создать Type объект (или вставить его с помощью запроса), так что мы можем иметь Type строку, мы можем относиться к Auction объект/запись, и сделать следующее:

//Example of Type obj creation 

$type = new Type(); 
$type->name = 'Type #1'; 
//Don't forget to save 
$type->save(); 

//OR find/retrieve a Type obj 

//Where $id is the id of the Type obj, else the obj will be null 
$type = Type::find($id); 

$auction = new Auction(); 

$auction->title = 'Title #1'; 
$auction->description = 'Test description'; 

$auction->type_id = $type->id; 

//Don't forget to save 
$auction->save(); 

Теперь в коде, когда вы используете Auction объект, и вы хотите, чтобы получить соответствующий тип (если таковые имеются), вы можете использовать:

$type = $auction->type()->get();

Который возвращает экземпляр Type, и вы будете иметь возможность получить имя свойства следующим образом:

$type->name

Я надеюсь, что это помогает! Позвольте мне знать, если у вас есть еще вопросы!

0

Вы можете попробовать это в вашей модели Auktion

$thetyp = App\Typ::find(1); 
$auktion->typ->save($thetyp); 

Теперь принести

$auktion->typ->name 
+0

См. Мой отредактированный вопрос – 4ndro1d

+0

удалить круглые скобки. попробуйте $ auktion-> typ-> save ($ thetyp); – Vikash

+0

'Undefined property: App \ Auktion :: $ typ' – 4ndro1d

1

Ваше второе изменение имеет много смысла. Имя вашего метода - typ, но это также название столбца. Поэтому, когда вы используете $auktion->typ(), это фактически загружает отношения. Когда вы используете $auktion->typ, он захватывает значение этого столбца.

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

Смежные вопросы