PDA

View Full Version : گیجی پس از مهاجرت از Codeigniter به Laravel



rostamiani
چهارشنبه 23 دی 1394, 11:09 صبح
سلام

من تصمیم گرفتم از Codeigniter بیام سمت Laravel و الآن دارم سعی می کنم یک پروژه کوچیک رو با Laravel بسازم.
آموزش های زیادی از لاراول دیدم ولی هنوز خیلی کارا رو نم دونم چطور انجام بدم. امیدوارم توی این پروژه تمرینی کمکم کنید تا راه بیفتم.
ببخشید که سوالاتم زیادی مبتری به نظر می رسند.
متشکرم

پروژه من یه سایت ثبت نام هست. کاربرا ثبت نام می کنند و پس از ورود می تونند درخواست های خودشون رو ثبت کنند.

سوالای من:

۱. چطور فرم رو پردازش کنم؟‌توی Codeigniter فرم رو به آدرس همین صفحه submit می کردم و اگه مقدار post براش ارسال شده بود وردازش می کردمش. اینجوری:


if ($this->input->post() != '') {
{
// Do something
}
else
// Show Form


۲. فرم ثبت نام رو باید طور خاصی بسازم که بتونم ازauth استفاده کنم؟ فرم Login رو چطور بسازم؟ قبلا دستی Session ها رو ست می کردم و بالای صفحه های لازم چک می کردم.

۳. توی Codeigniter هر Controller کار Route رو هم می کرد. ولی اینجا از هم جدا هستند. با این شرایط ایده خوبی هست که به ازای هر Route یک Controller بسازیم؟ یا مثلا کار خوبیه که چند تا Route رو به یک Controller ارجاع بدیم؟

۴. ساخت یک بانک اطلاعاتی بزرگ که توی MysqlWorkbench طراحی شده با migration خیلی پیچیده و مشکل به نظر می رسه. برای بانک های بزرگ این مورد رو توصیه می کنید؟ راهی برای ساده تر شدنش وجود داره؟

۵. اگه برای ساخت بانک اطلاعاتی از migration استفاده نکنم چطور ساختار جداول رو به لاراول بگم؟ داخل Model یا جای دیگه؟

متشکرم

hamedarian2009
چهارشنبه 23 دی 1394, 18:34 عصر
1- داخل تگ فرم خصوصیت action رو بهش مسیر رو میدین و این مسیر رو باید توی route هاتون مشخص می کنید به کدام کنترلر و اکشن بره
فرم:


<form action="{{ url('contact') }}" method="post">

این هم route:


Route::post('contact', 'SiteController@storeContact');

خب حالا تو کنترلر SiteController و اکشن storeContact اطلاعات فرم رو دریافت و پردازش میکنید

2-تو لاراول خودش یک سیستم auth پیش فرض داره فقط کافیه دستور make:auth رو بزنید کل فایل های مربوط به لاگین و ثبت و نام و ... ایجاد خواهد شد.

3- معمولا به ازای هر اکشن در کنترلر یک route باید ایجاد بشه بنابراین برای هر کنترلر چندین route نیازه و ایده هر route یک کنترلر کار درستی نیست

4-اجباری نیست که حتما از migration استفاده کنید اما اگه ازش استفاده کنید کدتون cross-platform خواهد بود و به هر پایگاه داده ای که براش تعیین می کنید جداولتون رو ایجاد کنید

5-نیاز نیست ساختار جدول رو به لاراول بگید فقط با استفاده از مدل ها می تونید عملیات مربوط به دیتابیس رو بر روی آن جدول با استفاده از Eloquent انجام بدین و معمولا هر جدول یک مدل هم داره که نام مدل همنام با نام جدول می گیرن با این تفاوت که جدول رو به صورت جمع می نویسن و مدل به صورت مفرد مثلا مدل User جدولش میشه users

rostamiani
یک شنبه 27 دی 1394, 08:52 صبح
دوباره سلام
خیلی توضیحات خوبی داده بودید. واقعا متشکرم.
ولی باز به مشکل خوردم و امیدوارم این دفعه هم بتونید کمکم کنید.
از دیروز می خوام چهار تا جدول با migration بسازم ولی هنوز موفق نشدم. واقعا ساختن چهار تا جدول نباید اینقدر دردسر داشته باشه. اینجوری برای ئروژه های بزرگ چکار میشه کرد؟ راه راحت تری داره؟
خب من بانک اطلاعاتی خودمو توی MySQL Workbenck طراحی کردم و جدول ها رو یکی یکی توی سایت adolfocuadros.com/sql_to_laravel کپی می کردم و به Migration اضافه می کردم. ولی در مورد ارتباط بین جداول به مشکل برخوردم.

متشکرم

تصویر بانک اطلاعاتی رو ضمیمه کردم.
این خطای Artisan :


php artisan migrate


[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: a
lter table `tours` add constraint tours_hotel_id_foreign foreign key (`hotel_id`) references `hotels` (`id`))



[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed")

اینم کد migration با اندکی تصرف:


<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAllTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('hotels', function(Blueprint $table) {
$table->engine = 'InnoDB';

$table->integer('id');
$table->integer('City')->nullable();
$table->string('Address', 500)->nullable();
$table->string('Tel', 200)->nullable();
$table->string('Name', 100)->nullable();
$table->tinyInteger('Stars')->nullable();
$table->timestamps();

});

Schema::create('tours', function(Blueprint $table) {
$table->engine = 'InnoDB';

$table->integer('id');
$table->integer('hotel_id')->unsigned();
$table->string('Name', 200)->nullable();
$table->date('StartDate')->nullable();
$table->date('EndDate')->nullable();
$table->tinyInteger('Eghamat')->nullable();
$table->tinyInteger('Haml')->nullable();
$table->integer('Days')->nullable();
$table->string('Food', 200)->nullable();
$table->string('tourcol1', 45)->nullable();
$table->timestamps();

$table->foreign('hotel_id')
->references('id')->on('hotels');

});

Schema::create('users', function(Blueprint $table) {
$table->engine = 'InnoDB';

$table->integer('id');
$table->string('FirstName', 200)->nullable();
$table->string('LastName', 200)->nullable();
$table->string('email')->unique();
$table->string('password', 60);
$table->string('FatherName', 200)->nullable();
$table->string('CodeMelli', 45)->nullable();
$table->string('Mobile', 45)->nullable();
$table->string('Phone', 45)->nullable();
$table->string('Address', 500)->nullable();
$table->tinyInteger('Jensiat')->nullable();
$table->string('Age', 45)->nullable();
$table->tinyInteger('Alayegh')->nullable();
$table->string('Job', 45)->nullable();
$table->tinyInteger('Savad')->nullable();
$table->string('Hamrahan', 1000)->nullable();
$table->rememberToken();
$table->timestamps();

});

Schema::create('membership', function(Blueprint $table) {
$table->engine = 'InnoDB';

$table->integer('user_id')->unsigned();
$table->integer('tour_id')->unsigned();
$table->timestamps();

$table->foreign('user_id')
->references('id')->on('users');
$table->foreign('tour_id')
->references('id')->on('tours');
});

Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token')->index();
$table->timestamp('created_at');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('tours');
Schema::drop('hotels');
Schema::drop('users');
Schema::drop('membership');
}
}

rostamiani
یک شنبه 27 دی 1394, 10:42 صبح
هر جدول رو توی یک فایل جدا نوشتم ولی بازم خطا نشون میده!
اگه هر جدول رو جدا بسازم به چه ترتیبی به بانک اطلاعاتی اضافه میشن؟ به ترتیب ساخته شدن فایل؟ :-/


[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_a6` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: a
lter table `tours` add constraint tours_hotel_id_foreign foreign key (`hotel_id`) references `hotels` (`id`))



[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_a6` (errno: 150 "Foreign key constraint is incorrectly formed")
[hr]

انگار فایل ها به ترتیب تاریخ اجرا میشن. یعنی به همون ترتیب لازم باید بسازمشون و اگه اشتباه کنم کلی دردسر داره :-(
ولی ظاهرا توی Eloquent هم میشه ارتباط ها رو ساخت. اینا با هم چه فرقی دارند. البته می دونم تو حاالت دوم روابط توی بانک اطلاعاتی ذخیره نیمشن ولی بازم توی برنامه اعمال میشن.

شایدم آخرش از خیر Relationship بگذرم. به نظرم این Migration خیلی ار رو سخت کرده.

شما واقعا برای بانک اطلاعاتی با بیش از 10 جدول از Migrations استفاده می کند؟
یک سوال دیگه:
اگه قرار باشه بعدا توی بانک اطلاعاتی تغییری به وجود بیارم برای آپدیت کردنش Artisan می تونه فقط اون تغییر رو اعمال کنه یا باید از اول بانک اطلااتی رو بسازم یا مثلا برای یک تغییر نام ساده باید یک فایل Migration جدید بسازم؟

متشکرم

MeSaeid
سه شنبه 29 دی 1394, 09:02 صبح
از

increments('id')
استفاده کن ببین مشکلت حل میشه