Diskuze: laravel "předchozí díl"
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, tahle pasáž je nějaká divná.
$article::find(...)
Proměnná $article je výstupem dřívějšího dotazu a skoro určitě nejde o třídu se statickou metodou find. Podle mého jsi chtěl zavolat Laravel model, čili bych čekal něco jako.
$articl = Article::find($article->previous_part_id)->first();
Výpis bys měl ošetřit podmínkou. Ovšem ne podle toho, že tvůj článek obsahuje previous_part_id (tím řeš pouze to, zda se budeš dotazovat do DB), ale až podle toho, že jsi předchozí článek v DB našel.
$articl = Article::find($article->previous_part_id)->first();
@if ($articl !== null)
<div class="previous_part">
...
<a href="{{ url("article/" . $articl->url) }}">{{ $articl->title }}</a>
...
</div>
@endif
Jestli Ti můžu poradit, zaměř se při tom učení taky na to, jak si podobné dotazy vyřešit v Controlleru a nedávej je do šablony. Jinak Laravel má velmi dobrou dokumentaci, tak ji využij a podívej se na modely a blade šablony včetně if statements, protože tam máš další chybu v použití závorek, které do blade nepatří a ještě je máš i špatně ukončené, že by Ti zůstal jeden konec DIVu navíc.
Určit na to mrknu, ale každopádně když jsem zkusil to co jsi mi poslal tak mám nový problém
Call to a member function first() on null
Ahoj, rozhodně bych doporučoval získávat data v kontroleru a ne v
pohledu. Pohled má jen zobrazovat data, které dostane od kontroleru
Každopádně k tvému problému: find()
nic nenašel (=
null
), proto ani first()
nelze použít. Na
find()
by se ani first()
nemělo používat, jelikož
výsledkem je rovnou model, ne kolekce.
Navíc by bylo vhodné tohle převést do vztahu, abys to nemusel nijak
složitě získávat. Nevím, u jaké lekce aktuálně jsi, probírá se to
dále v seriálu.
Ahoj, máš pravdu, k find() už first() nepatří. Moje chyba.
Mám ho za sebou, ale procházím si to znovu. Kvůli některým věcem. Každopádně mě nenapadlo že by to šlo vyřešit i pomocí vztahu.
Tak asi budu potřebovat lehce nakopnout a to s výpisem. Takže co mám, resp. co jsem udělal.
Rozhodl jsem se pro vztah takže to řeším eloquent vztahem hasOne. Vztah řeším v rámci jedné tabulky.
Vztahy jsem doplnil takto:
public function serial()
{
return $this->hasOne('article', 'previous_part_id');
}
public function article() {
return $this->belongsTo('article', 'previous_part_id');
}
První pokus o výpis skončil chybou: Class 'article' not found
return view('article.show', ['article' => $article, 'previous' => Article::find(1)->serial]);
Druhý pokus mi vyhodil stejnou chybu. Zde jsem se o výpis pokusil již v show.blade.php bez deklarace proměnné
{{ $article->serial->previous_part_id }}
//Zkoušel jsem i variantu
{{ $article->article->previous_part_id }}
Ve vztahu se definuje odkaz na třídu. Ty jsi pouze předal textový
řetězec "article"
. Proto ti to správně vyhazuje chybu, že
třída article
nebyla nalezena. Správné možnosti tedy jsou:
public function previous()
{
return $this->hasOne('App\Article', 'previous_part_id');
}
Nebo druhá možnost, kterou preferuji více:
public function previous()
{
return $this->hasOne(static::class, 'previous_part_id'); // normálně by to bylo Article::class, ale jelikož se jedná o stejnou třídu, lze použít static::class
}
Zobrazeno 8 zpráv z 8.